将数据转换为3列x 24行矩阵,并按ID和小时计数

时间:2015-11-24 09:58:26

标签: sql sql-server sql-server-2008

如果你们能帮助我弄清楚如何: 根据时间在单个列上选择12个单独的计数(对于一个日期,我假设通过首先在顶部的声明日期,然后插入时间,我认为我理解的部分)第二个是一次建立12个单独的案例 运行它们3次,这样你就可以在3个独立的IDS上获得12个计数。

所有这些都在一张桌子里。

我认为它可行的方式但不是

Declare @Date DATE

set @Date = '24-11-2015' 

Select (case(Select statement here) where Projectid in()) as A,
       (case(Select statement here) where Projectid in()) as B,
       (case(Select statement here) where Projectid in()) as C

如果有人理解我的意思,如果你能帮助我,我将不胜感激。

输入数据:

Project id  Datetime                 Necessary
----------  -----------------------  ---------
5           11-23-2015 09:00:00.000  1
5           11-23-2015 10:00:00.000  1
6           11-23-2015 11:00:00.000  0
1           11-23-2015 12:00:00.000  1
3           11-23-2015 13:00:00.000  1
124         11-23-2015 14:00:00.000  1
124         11-23-2015 15:00:00.000  1
124         11-23-2015 16:00:00.000  0
576         11-23-2015 17:00:00.000  0
576         11-23-2015 18:00:00.000  1
576         11-23-2015 19:00:00.000  1
etc         11-23-2015 20:00:00.000  1

预期产出:

Datetime       5    124  576
-------------  ---  ---  ---
09:00 - 09:59  0    4    5
10:00 - 10:59  4    3    1
11:00 - 11:59  5    2    1
12:00 - 12:59  1    1    1
13:00 - 13:59  6    1    1
14:00 - 14:59  6    1    1
15:00 - 15:59  7    1    2
16:00 - 16:59  8    1    3
17:00 - 17:59  9    1    3
18:00 - 18:59  1    1    2
19:00 - 19:59  12   1    0
20:00 - 20:59  0    0    0

我正在寻找的是projectids 5 124和576作为列变量 应该计算行的方式基于每小时的时间。

到目前为止,在Salman A的帮助下我得到了什么

 Hour   5  124  576
    8   9   0   1
    9   0   11  10
    10  4   8   15
    11  0   10  7
    12  1   4   17
    13  6   18  6
    14  2   5   27
    15  4   1   43
    16  4   11  40
    17  3   11  3
    18  6   2   9
    19  9   5   7

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要使用值0...11tricks discussed here)加入您的表格,然后点按COUNT(CASE...)

SELECT
    master..spt_values.number AS [Hour of Day],
    COUNT(CASE WHEN projectid IN (1, 2) THEN 1 END) AS [Project 1 and 2],
    COUNT(CASE WHEN projectid IN (3, 4) THEN 1 END) AS [Project 3 and 4],
    COUNT(CASE WHEN projectid IN (5, 6) THEN 1 END) AS [Project 5 and 6]
FROM master..spt_values
LEFT JOIN yourtable ON master..spt_values.number = DATEPART(HOUR, yourdatetime)
WHERE master..spt_values.number BETWEEN 0 AND 11 AND master..spt_values.type = 'p'
GROUP BY master..spt_values.number
ORDER BY master..spt_values.number