填写MsSql语句中的固定小时类别

问题描述 投票:0回答:2

我正在尝试构建一个应为统计函数提供数据的SQL语句。

我的SQL:

SELECT COUNT(Ac_Id) As TotalCount, DATEPART(hour, Ac_Date) as HoursName, Ac_Customer_Id 
  FROM Access
 GROUP BY Ac_Customer_Id ,DATEPART(hour, Ac_Date)
 ORDER BY Ac_Customer_Id, HoursName

结果看起来像这样:

TotalCount |HoursName |Customer_Id
-----------|----------|-----------
1          |6         |12345
4          |7         |12345
28         |8         |12345
40         |9         |12345
10         |10        |12345
6          |11        |12345
1          |13        |12345
4          |14        |12345
1          |15        |12345
1          |16        |12345
2          |17        |12345
1          |18        |12345
1          |19        |12345
5          |20        |12345
8          |21        |12345
7          |22        |12345
9          |23        |12345
2          |9         |65432
3          |10        |65432
4          |11        |65432

现在我每天的每个小时需要一个记录,因此结果应如下所示:

TotalCount |HoursName |Customer_Id
-----------|----------|-----------
 0         |1         |12345
 0         |2         |12345
 0         |3         |12345
 0         |4         |12345
 0         |5         |12345
 1         |6         |12345
 4         |7         |12345
 28        |8         |12345
 40        |9         |12345
 10        |10        |12345
 6         |11        |12345
 0         |12        |12345
 1         |13        |12345
 4         |14        |12345
 1         |15        |12345
 1         |16        |12345
 2         |17        |12345
 1         |18        |12345
 1         |19        |12345
 5         |20        |12345
 8         |21        |12345
 7         |22        |12345
 9         |23        |12345
 0         |0         |65432
 0         |1         |65432
 0         |2         |65432
 0         |3         |65432
 0         |4         |65432
 0         |5         |65432
 0         |6         |65432
 0         |7         |65432
 0         |8         |65432
 2         |9         |65432
 3         |10        |65432
 4         |11        |65432

计算我意识到的答案,我不清楚:我需要为每个AC_Customer_Id填写小时。我更新了结果期望值。 @MichałTurczyn和@Salman A的答案存在的问题是,他们没有选择Ac_Customer_Id。和

 0         |12        |12345

没有出现。有可能做到这一点吗?

再次感谢您

sql-server group-by case
2个回答
0
投票

您需要CROSS JOIN才能生成小时表和客户列表的所有可能组合:

SELECT hourlist.HoursName, customerlist.Customer_Id, COALESCE(t.TotalCount, 0)
FROM (VALUES
    (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23)
) AS hourlist(HoursName)
CROSS JOIN (
    SELECT DISTINCT Customer_Id
    FROM t
) AS customerlist
LEFT JOIN t ON hourlist.HoursName = t.HoursName AND customerlist.Customer_Id = t.Customer_Id

应该很容易使查询适应您的需求。


0
投票

我建议使用像CTE这样的“日历”:

with calendarCte as (
    select 0 as [hour]
    union all
    select [hour] + 1 from calendarCte
    where [hour] < 24
)

select coalesce(a.TotalCount, 0),
       calendarCte.[hour],
       Ac_Customer_Id
from (
    SELECT COUNT(Ac_Id) As TotalCount, DATEPART(hour, Ac_Date) as HoursName, Ac_Customer_Id 
      FROM Access
     GROUP BY Ac_Customer_Id ,DATEPART(hour, Ac_Date)
) a full join calendarCte on a.HoursName = calendarCte.[hour]
© www.soinside.com 2019 - 2024. All rights reserved.