2017-07-11 7 views
0

私はSQL Serverデータベースを持っており、特定のデータを取得しようとしています。私は各行のすべての非NULL列のカウント、別の列からの減算、および他のテーブル列(結合)からのデータが必要です。ジョインと計算を組み合わせた非ヌルの数を計算する方法が難しい

これは私がいる場所です。誰かがコードを見て、私が間違っていることを教えてください(ハードコードされた日付は無視してください、彼らはテスト専用です)。それは、集計関数またはGROUP BY句に含まれていないため

>列「tblTimeClock.Time0」は、選択リストでは無効です:上記で

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句に含める方法はわかりません。試行するたびに、他のエラーがポップアップ表示されます(句を配置する場所によって異なります)。

誰かが「私が間違っていることを教えてくれますか」と尋ねた理由は、壊れたものを修正すると、その後の問題ごとに何度も "ヘルプ"を返す必要がないからです。私はコードが悪いことを知っている、これがなぜ私は助けが必要です。

+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 
関連する問題