【发布时间】:2019-07-20 09:09:11
【问题描述】:
我每小时显示交易数量,效果很好。但是,现在我需要显示发生 0 个事务的 hr 以及存在的 hrs 事务。所以显示小时数,如果该小时内没有事务计数,则显示 0。
不确定我是否能够正确解释我真的很抱歉(如果我不这样做),但下面的 SQL 语句和输出将帮助您理解我想要实现的目标。
我在 SQL Server 上运行的 SQL 查询是
SELECT CAST([transOcurredOn] AS DATE) as Dategg,
DATEPART(HH,transOcurredOn) as 'hour',
COUNT(*) AS 'Trans count'
FROM [tpTrans]
WHERE [transOcurredOn] > '2016-06-18'
GROUP BY CAST([transOcurredOn] AS DATE) ,DATEPART(HH,transOcurredOn)
ORDER BY Dategg,hour
所以我的当前输出看起来像
我的新输出应如下所示,涵盖整个 7 到 23 小时的时钟。我突出显示了更改
我有点挣扎,如果有人指出我正确的方向,不胜感激
块引用
ing,应用程序
【问题讨论】:
-
创建一个可能的小时数表(24 行),dynamically 或作为一个实际表,并将您现有的查询与它左连接。如果您也有几天根本没有交易,还可以生成一个可能的日期列表,将其交叉连接到可能的时间,然后将结果与您现有的查询一起左连接。
-
不确定我是否理解正确,但如何加入没有关系的临时表。例如如果我创建一个临时表来填充计数 1 到 24,如何在不循环的情况下在不同的日期连续显示相同的值。?我跑了一整年,我不知道哪个 hr 没有交易。这是一个 15 小时的操作
-
交叉连接不需要连接条件。
-
所以我创建了临时表,插入了从 7 到 23 小时的工作时间并添加了交叉连接,它弄乱了事务计数输出。我尝试将 hr 列添加到查询中,并且它已经 3 分钟的查询仍在运行。所以我杀了它。 SELECT CAST([transOcurredOn] AS DATE) as Dategg, DATEPART(HH,transOcurredOn) as 'hour', z.hrcount COUNT(*) AS 'Trans count' FROM [tpTrans] cross join zz_temptable z WHERE [transOcurredOn] > '2016 -06-18' GROUP BY CAST([transOcurredOn] AS DATE) ,DATEPART(HH,transOcurredOn),z.hourcount ORDER BY Dategg,hour
-
不,您不会将可能的时间与实际交易交叉加入。您将可能的小时数与可能的天数交叉加入,然后在日期和时间相等的情况下将结果与实际交易分开。
标签: sql-server select aggregate-functions