【问题标题】:Having a difficult time figuring out how to count non nulls in a row combined with joins and calculations很难弄清楚如何结合连接和计算计算连续的非空值
【发布时间】: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/…
  • 已更新以解释问题并澄清所提出的问题。

标签: join count null sum case


【解决方案1】:

我自己想出来的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多