【发布时间】:2017-07-11 16:41:18
【问题描述】:
我有一个 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
由于上述情况,我收到此错误:
> 列 'tblTimeClock.Time0' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
但我不知道如何将它包含在 GROUP BY 子句中 - 每次我尝试时都会弹出其他错误(不同,取决于我放置子句的位置)。
我问是否有人可以“告诉我我做错了什么”的原因是,一旦我修复了损坏的问题,我就不必为后续的每个问题一次又一次地说“帮助”。我知道代码很糟糕,这就是我需要帮助的原因。
【问题讨论】:
-
您没有解释问题或提出问题。 (您能告诉我哪里出了问题吗? 不是一个可以回答的问题。)请描述您发布的 SQL 遇到的问题。
-
如果您想获取非空列的计数,请参阅stackoverflow.com/questions/18193365/…
-
已更新以解释问题并澄清所提出的问题。