【问题标题】:group by issue in sql在sql中按问题分组
【发布时间】:2019-11-22 17:19:39
【问题描述】:

我正在尝试在新列中添加 08:00 到 18:00 之间的会话。您可以在 CTE 中看到我的最后一个 CASE。对于每个日期,都应该有一个新列“TotalRestrictedSessions”,指示该特定日期有多少会话。如果没有,在这种情况下我必须写 0。我怀疑我的问题是当我转换 DATE 时?

WITH ParkeonCTE
AS
(
SELECT 
    OccDate = CONVERT(DATE, OC.LocalStartTime),
    TotalOccSessions = COUNT(OC.SessionId),
    AuthorityId,
    TotalOccDuration = ISNULL(SUM(OC.DurationMinutes),0),
    TotalNumberOfOverstay = SUM(CAST(OC.IsOverstay AS INT)),
    TotalMinOfOverstays = ISNULL(SUM(OC.OverStayDurationMinutes),0),
    (CASE
        WHEN OC.OspId IS NULL THEN 'OffStreet' ELSE 'OnStreet'
        END
    ) AS ParkingContextType,
    (CASE
        WHEN CAST(OC.LocalStartTime AS TIME) >= '08:00:00' AND CAST(OC.LocalStartTime AS TIME) <= 
 '18:00:00'
            THEN COUNT(OC.SessionId)
     END
    ) AS TotalRestrictedSessions
FROM Analytics.OccupancySessions AS OC
WHERE OC.AuthorityId IS NOT NULL
GROUP BY  CONVERT(DATE,OC.LocalStartTime), OC.AuthorityId,OC.OspId
)
SELECT OC.OccDate,
   OC.ParkingContextType,
   OC.AuthorityId,
   OC.TotalRestrictedSessions,
   SUM(OC.TotalOccSessions) AS TotalOccSessions,
   AVG(OC.TotalOccDuration) AS AvgOccMinutesDuration, -- wrong
   SUM(OC.TotalOccDuration) AS TotalOccDuration,
   SUM(OC.TotalNumberOfOverstay) AS TotalNumberOfOverstay,
   SUM(OC.TotalMinOfOverstays) AS TotalMinOfOverstays,
   CAST(AVG(OC.TotalMinOfOverstays) AS decimal(10,2)) AS AvgMinOfOverstays -- wrong
  FROM ParkeonCTE AS OC
GROUP BY OC.OccDate, OC.AuthorityId, OC.ParkingContextType
ORDER BY OC.OccDate DESC

【问题讨论】:

  • 有什么问题?不知道问题出在哪里,我只是猜测SUM(CASE WHEN CAST(OC.LocalStartTime AS TIME) &gt;= '08:00:00' AND CAST(OC.LocalStartTime AS TIME) &lt;= '18:00:00' THEN 1 Else 0 END ) AS TotalRestrictedSessions 可能会有所帮助?

标签: sql tsql group-by common-table-expression


【解决方案1】:

您只需将聚合移到 CASE 表达式之外,称为条件聚合。

  SUM(CASE
        WHEN CAST(OC.LocalStartTime AS TIME) >= '08:00:00' 
        AND CAST(OC.LocalStartTime AS TIME) <= '18:00:00'
         THEN 1
         ELSE 0
      END
    ) AS TotalRestrictedSessions

通常,您应该在问题中包含当前查询结果和您想要的结果,以便更容易找出问题所在。

【讨论】:

  • 谢谢,埃里克 - 我现在明白了。这解决了现在的问题,我猜。我必须检查数据以确保:)。我的问题是,如果我将 DateTime 转换为时间,我按特定时间过滤的方法是否正确?
  • 如果没有可用的样本数据,很难回答这个更广泛的问题。我建议您从获取足够的数据子集开始,以便您可以看到结果应该是什么,然后针对它运行查询并查看它是否返回您所期望的。如果没有,请发布一个新问题,其中包含您的示例数据、您获得的结果以及您期望的结果模型。
猜你喜欢
  • 2010-10-30
  • 2012-02-19
  • 2011-06-20
  • 2010-10-17
  • 1970-01-01
  • 2010-10-10
  • 2020-12-05
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多