Sql 整天

Sql 整天,sql,sql-server,tsql,Sql,Sql Server,Tsql,在我的sql查询中,我计算每天每小时的订单数量。我的查询如下所示: SELECT COUNT(dbo.Uputa.ID),{ fn HOUR(dbo.Orders.Date) } AS Hour FROM Orders WHERE dbo.Orders.Date BETWEEN '2011-05-01' AND '2011-05-26' GROUP BY { fn HOUR(dbo.Orders.Date) } ORDER BY Hour Number

在我的sql查询中,我计算每天每小时的订单数量。我的查询如下所示:

SELECT   COUNT(dbo.Uputa.ID),{ fn HOUR(dbo.Orders.Date) } AS Hour
FROM      Orders       
WHERE dbo.Orders.Date BETWEEN '2011-05-01' AND '2011-05-26' 
GROUP BY { fn HOUR(dbo.Orders.Date) }
ORDER BY Hour
 Number      Hour
    0          0
    0          1
    0          2
    12         3
    0          4
    12         5
   ...
    0          23
我的问题是查询只返回dbo.Orders.Date中现有的小时数。 例如:

Number   Hour
12         3
12         5
我希望所有时间都像这样返回:

SELECT   COUNT(dbo.Uputa.ID),{ fn HOUR(dbo.Orders.Date) } AS Hour
FROM      Orders       
WHERE dbo.Orders.Date BETWEEN '2011-05-01' AND '2011-05-26' 
GROUP BY { fn HOUR(dbo.Orders.Date) }
ORDER BY Hour
 Number      Hour
    0          0
    0          1
    0          2
    12         3
    0          4
    12         5
   ...
    0          23
有人知道如何做到这一点吗?

您可以使用a添加缺少的小时数,并将这些小时数与原始查询连接起来以填补空白

SQL语句

测试脚本


使用公共表表达式创建所有小时数,然后左键联接分组的总计以获得结果

with mycte as
(
    SELECT 0 AS MyHour
    UNION ALL
    SELECT MyHour + 1
    FROM mycte 
    WHERE MyHour + 1 < 24
)
SELECT mycte.MyHour, COALESCE(OrderCount,0) FROM mycte
LEFT JOIN 
(
    SELECT  COUNT(dbo.Uputa.ID) AS OrderCount,{ fn HOUR(dbo.Orders.Date) } AS MyHour
    FROM    Orders       
    WHERE   dbo.Orders.Date BETWEEN '2011-05-01' AND '2011-05-26' 
    GROUP BY { fn HOUR(dbo.Orders.Date) }
) h
ON
  h.MyHour = mycte.MyHour;
例如,“数字表”通常是数据库中非常有用的东西;如果您在此处创建一个,您可以从数字表中选择0到23之间的所有行,将其与结果左键连接,您将获得所需的结果,而无需为此查询创建自定义CTE或类似内容

SELECT   COUNT(dbo.Uputa.ID),n.number AS Hour
FROM     (select number from numbers where number between 0 and 23) n 
             left join Orders o on n.number={ fn HOUR(dbo.Orders.Date) }
WHERE dbo.Orders.Date BETWEEN '2011-05-01' AND '2011-05-26' 
GROUP BY n.number
ORDER BY n.number

为了清晰起见,我已经按照您的示例对此进行了措辞,但实际上我会尽量避免在连接条件中添加函数以最大限度地提高性能。

创建mycte时,sql server语法并不积极,但理论听起来是正确的……在我上传答案之前检查了CTE部分。看起来有效:D