2017-07-11 49 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