2017-07-11 26 views
0

我有一个SQL Server数据库,我试图提取特定的数据。我需要计算每行中的所有非空列,从另一列中减去一列,以及从其他表列(连接)中获取数据。在困难的时候计算出如何计算连续的非空值以及连接和计算

这就是我所在的地方,有人可以看看代码并告诉我我做错了什么(忽略硬编码的日期,它们仅用于测试)?

SELECT 
    ((CASE WHEN TC.Time0 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time1 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time2 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time3 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time4 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time5 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time6 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time7 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time8 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time9 IS NOT NULL THEN 1 ELSE 0 END)) AS [Time Punches] 
    ,SUM(CASE WHEN TC.Odometer0 IS NOT NULL THEN 1 ELSE 0 END) AS MileageStart 
    ,SUM(CASE WHEN TC.Odometer1 IS NOT NULL THEN 1 ELSE 0 END) AS MileageEnd 
    ,SUM(CASE WHEN MileageEnd >= 0 THEN 1 ELSE 0 END) - 
     SUM(CASE WHEN MileageStart < 0 THEN 1 ELSE 0 END) AS [Total Miles] 
    ,D.DriverID AS [Driver ID] 
    ,W.FirstName +' '+W.LastName AS [Driver Name] 
    ,TC.PunchDate AS [DATE] 
FROM tblTimeClock TC WITH (NOLOCK) 
INNER JOIN tblDrivers D WITH (NOLOCK) 
ON D.DriverID = TC.PunchID 
INNER JOIN tblWorker W WITH (NOLOCK) 
ON W.WorkerID = D.DriverID 
WHERE TC.PunchID IS NOT NULL 
AND TC.PunchDate BETWEEN '2017-05-01' AND '2017-06-01' 
ORDER BY TC.PunchDate 

通过以上我收到此错误:

>,因为它不是在聚合函数或GROUP BY子句中包含列“tblTimeClock.Time0”在选择列表中无效。

但我不知道如何将其包含在GROUP BY子句中 - 每次尝试时都会弹出其他错误(不同,取决于放置子句的位置)。

我问及是否有人可以“告诉我我做错了什么”的原因是,一旦我解决了什么问题,我不必一次又一次地为每个后续问题回答“帮助” 。我知道代码很糟糕,这就是为什么我需要帮助。

+0

你没有解释一个问题,或者问了一个问题。 (*你能告诉我什么是错的吗?*不是一个可回答的问题。)描述你在发布的SQL时遇到的问题。 –

+0

如果你想获得非空列的计数,请参阅https://stackoverflow.com/questions/18193365/count-of-non-null-columns-in-each-row –

+0

已更新,以解释问题并澄清问的问题。 –

回答

0

我想通了我自己:

SELECT 
    TC.PunchDate AS [Date] 
    ,D.DriverID AS [Driver ID] 
    ,W.FirstName +' '+W.LastName AS [Driver Name] 
    ,((CASE WHEN TC.Time0 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time1 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time2 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time3 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time4 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time5 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time6 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time7 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time8 IS NOT NULL THEN 1 ELSE 0 END) 
    + (CASE WHEN TC.Time9 IS NOT NULL THEN 1 ELSE 0 END)) AS [Time Punches] 
    ,TC.Odometer0 AS [Starting Mileage] 
    ,TC.Odometer1 AS [Ending Mileage] 
    ,SUM(CASE WHEN TC.Odometer1 IS NOT NULL AND TC.Odometer1 >= 0 THEN TC.Odometer1 ELSE 0 END) - 
    SUM(CASE WHEN TC.Odometer0 IS NOT NULL AND TC.Odometer0 >= 0 THEN TC.Odometer0 ELSE 0 END) AS [Total Miles] 
     FROM tblTimeClock TC WITH (NOLOCK) 
    INNER JOIN tblDrivers D WITH (NOLOCK) 
     ON CAST(D.DriverID AS VARCHAR(50)) = TC.PunchID 
    INNER JOIN tblWorker W WITH (NOLOCK) 
     ON W.WorkerID = D.DriverID 
    WHERE TC.PunchID IS NOT NULL 
    AND TC.PunchDate BETWEEN @StartDate AND @EndDate 
    GROUP BY TC.Time0, TC.Time1, TC.Time2, TC.Time3, TC.Time4, TC.Time5, TC.Time6, TC.Time7, TC.Time8, TC.Time9, TC.Odometer0,TC.Odometer1, D.DriverID, W.FirstName, W.LastName, TC.PunchDate 
    ORDER BY TC.PunchDate