Sql server Sql Server交叉表查询
我有一个包含日期/时间和其他类似字段的数据Sql server Sql Server交叉表查询,sql-server,sql-server-2008-r2,pivot-table,crosstab,Sql Server,Sql Server 2008 R2,Pivot Table,Crosstab,我有一个包含日期/时间和其他类似字段的数据 ASSIGN ASSIGN_DATE OFFICER ASSIGN-1 2013-07-17 19:37:09.000 Admin ASSIGN-2 2013-07-17 19:37:09.000 Admin ASSIGN-3 2013-07-17 19:37:09.000 Admin ASSIGN-4 2013-07-17 10:40:15.000 TESTER ASSIGN-5 201
ASSIGN ASSIGN_DATE OFFICER
ASSIGN-1 2013-07-17 19:37:09.000 Admin
ASSIGN-2 2013-07-17 19:37:09.000 Admin
ASSIGN-3 2013-07-17 19:37:09.000 Admin
ASSIGN-4 2013-07-17 10:40:15.000 TESTER
ASSIGN-5 2013-07-17 19:37:09.000 Admin
ASSIGN-5 2013-07-17 19:50:00.000 Admin
ASSIGN-6 2013-07-17 10:40:15.000 TESTER
ASSIGN-7 2013-07-17 10:40:15.000 TESTER
OFFICER ASS1 ASS2 ASS3 ASS4 ASS5 ASS6 ASS7 Total
Admin
00 0 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0 0
02 0 0 0 0 0 0 0 0
03 0 0 0 0 0 0 0 0
04 0 0 0 0 0 0 0 0
05 0 0 0 0 0 0 0 0
06 0 0 0 0 0 0 0 0
07 0 0 0 0 0 0 0 0
08 0 0 0 0 0 0 0 0
09 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0
19 1 1 1 0 2 0 0 5
20 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
TESTER
00 0 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0 0
02 0 0 0 0 0 0 0 0
03 0 0 0 0 0 0 0 0
04 0 0 0 0 0 0 0 0
05 0 0 0 0 0 0 0 0
06 0 0 0 0 0 0 0 0
07 0 0 0 0 0 0 0 0
08 0 0 0 0 0 0 0 0
09 0 0 0 0 0 0 0 0
10 0 0 0 1 0 1 1 3
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0
19 0 0 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
我尝试使用sum for sum assign-1来分配-7
SELECT OFFICER,
sum(case when [ASSIGN] = 'ASSIGN-1' then 1 else 0 end) ASS1,
sum(case when [ASSIGN] = 'ASSIGN-2' then 1 else 0 end) ASS2,
sum(case when [ASSIGN] = 'ASSIGN-3' then 1 else 0 end) ASS3,
sum(case when [ASSIGN] = 'ASSIGN-4' then 1 else 0 end) ASS4,
sum(case when [ASSIGN] = 'ASSIGN-5' then 1 else 0 end) ASS5,
sum(case when [ASSIGN] = 'ASSIGN-6' then 1 else 0 end) ASS6,
sum(case when [ASSIGN] = 'ASSIGN-7' then 1 else 0 end) ASS7
FROM [BizView_Dev2].[dbo].[PROBLEM_ASSIGN_LOG]
GROUP BY [ASSIGN_DATE],OFFICER
这是功的总和
OFFICER ASS1 ASS2 ASS3 ASS4 ASS5 ASS6 ASS7
Admin 1 1 1 0 1 0 0
TESTER 4 0 0 1 0 1 1
我想做一个交叉表,按日期使用officer
和Assign\u date
(仅使用时间00-24),并计算有多少分配是这样的
ASSIGN ASSIGN_DATE OFFICER
ASSIGN-1 2013-07-17 19:37:09.000 Admin
ASSIGN-2 2013-07-17 19:37:09.000 Admin
ASSIGN-3 2013-07-17 19:37:09.000 Admin
ASSIGN-4 2013-07-17 10:40:15.000 TESTER
ASSIGN-5 2013-07-17 19:37:09.000 Admin
ASSIGN-5 2013-07-17 19:50:00.000 Admin
ASSIGN-6 2013-07-17 10:40:15.000 TESTER
ASSIGN-7 2013-07-17 10:40:15.000 TESTER
OFFICER ASS1 ASS2 ASS3 ASS4 ASS5 ASS6 ASS7 Total
Admin
00 0 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0 0
02 0 0 0 0 0 0 0 0
03 0 0 0 0 0 0 0 0
04 0 0 0 0 0 0 0 0
05 0 0 0 0 0 0 0 0
06 0 0 0 0 0 0 0 0
07 0 0 0 0 0 0 0 0
08 0 0 0 0 0 0 0 0
09 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0
19 1 1 1 0 2 0 0 5
20 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
TESTER
00 0 0 0 0 0 0 0 0
01 0 0 0 0 0 0 0 0
02 0 0 0 0 0 0 0 0
03 0 0 0 0 0 0 0 0
04 0 0 0 0 0 0 0 0
05 0 0 0 0 0 0 0 0
06 0 0 0 0 0 0 0 0
07 0 0 0 0 0 0 0 0
08 0 0 0 0 0 0 0 0
09 0 0 0 0 0 0 0 0
10 0 0 0 1 0 1 1 3
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
16 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0
19 0 0 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
也许这不是最有效的解决方案,但效果很好: 测试数据:
CREATE TABLE #Test
(
ASSIGN VARCHAR(255)
, ASSIGN_DATE DATETIME2
, OFFICER VARCHAR(255)
);
INSERT INTO #Test
(ASSIGN, ASSIGN_DATE, OFFICER)
VALUES
('ASSIGN-1', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-2', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-3', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-4', '2013-07-17 10:40:15.000', 'TESTER')
, ('ASSIGN-5', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-5', '2013-07-17 19:50:00.000', 'Admin')
, ('ASSIGN-6', '2013-07-17 10:40:15.000', 'TESTER')
, ('ASSIGN-7', '2013-07-17 10:40:15.000', 'TESTER');
;WITH TableName
AS (
SELECT OFFICER
, D.[Hour]
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-1' THEN 1 ELSE 0 END) ASS1
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-2' THEN 1 ELSE 0 END) ASS2
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-3' THEN 1 ELSE 0 END) ASS3
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-4' THEN 1 ELSE 0 END) ASS4
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-5' THEN 1 ELSE 0 END) ASS5
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-6' THEN 1 ELSE 0 END) ASS6
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-7' THEN 1 ELSE 0 END) ASS7
FROM #Test AS T
CROSS APPLY (SELECT DATEPART(HOUR, [ASSIGN_DATE])) AS D([Hour])
GROUP BY [Hour], OFFICER
)
SELECT DISTINCT T.[OFFICER]
, D.[Hour]
, COALESCE(ASS1, 0) AS ASS1
, COALESCE(ASS2, 0) AS ASS2
, COALESCE(ASS3, 0) AS ASS3
, COALESCE(ASS4, 0) AS ASS4
, COALESCE(ASS5, 0) AS ASS5
, COALESCE(ASS6, 0) AS ASS6
, COALESCE(ASS7, 0) AS ASS7
, COALESCE(ASS1, 0) + COALESCE(ASS2, 0) + COALESCE(ASS3, 0) + COALESCE(ASS4, 0) + COALESCE(ASS5, 0) + COALESCE(ASS6, 0) + COALESCE(ASS7, 0) AS Total
FROM #Test AS T
CROSS JOIN (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 D([Hour])
LEFT JOIN TableName AS TN
ON TN.[OFFICER] = T.[OFFICER]
AND TN.[Hour] = D.[Hour]
ORDER BY T.[OFFICER]
, D.[Hour];
实际查询:
CREATE TABLE #Test
(
ASSIGN VARCHAR(255)
, ASSIGN_DATE DATETIME2
, OFFICER VARCHAR(255)
);
INSERT INTO #Test
(ASSIGN, ASSIGN_DATE, OFFICER)
VALUES
('ASSIGN-1', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-2', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-3', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-4', '2013-07-17 10:40:15.000', 'TESTER')
, ('ASSIGN-5', '2013-07-17 19:37:09.000', 'Admin')
, ('ASSIGN-5', '2013-07-17 19:50:00.000', 'Admin')
, ('ASSIGN-6', '2013-07-17 10:40:15.000', 'TESTER')
, ('ASSIGN-7', '2013-07-17 10:40:15.000', 'TESTER');
;WITH TableName
AS (
SELECT OFFICER
, D.[Hour]
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-1' THEN 1 ELSE 0 END) ASS1
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-2' THEN 1 ELSE 0 END) ASS2
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-3' THEN 1 ELSE 0 END) ASS3
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-4' THEN 1 ELSE 0 END) ASS4
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-5' THEN 1 ELSE 0 END) ASS5
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-6' THEN 1 ELSE 0 END) ASS6
, SUM(CASE WHEN T.[ASSIGN] = 'ASSIGN-7' THEN 1 ELSE 0 END) ASS7
FROM #Test AS T
CROSS APPLY (SELECT DATEPART(HOUR, [ASSIGN_DATE])) AS D([Hour])
GROUP BY [Hour], OFFICER
)
SELECT DISTINCT T.[OFFICER]
, D.[Hour]
, COALESCE(ASS1, 0) AS ASS1
, COALESCE(ASS2, 0) AS ASS2
, COALESCE(ASS3, 0) AS ASS3
, COALESCE(ASS4, 0) AS ASS4
, COALESCE(ASS5, 0) AS ASS5
, COALESCE(ASS6, 0) AS ASS6
, COALESCE(ASS7, 0) AS ASS7
, COALESCE(ASS1, 0) + COALESCE(ASS2, 0) + COALESCE(ASS3, 0) + COALESCE(ASS4, 0) + COALESCE(ASS5, 0) + COALESCE(ASS6, 0) + COALESCE(ASS7, 0) AS Total
FROM #Test AS T
CROSS JOIN (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 D([Hour])
LEFT JOIN TableName AS TN
ON TN.[OFFICER] = T.[OFFICER]
AND TN.[Hour] = D.[Hour]
ORDER BY T.[OFFICER]
, D.[Hour];
我将按DATEPART(小时,[ASSIGN_DATE])分组,并将其包含在SELECT语句中。然而,你会有一些空白,没有你必须填补的作业。也许使用左连接?很抱歉,我忘了将此
(在子字符串(CONVERT(varchar(20),ASSIGN_DATE,14),1,2)='01'然后'01'END)作为Hour1
时,我希望它们显示所有24小时,即使它不存在哦,我应该创建一个包含12个月的表,对吗?我很高兴听到这个消息!