0
我有一个查询产生以下的输出:如何以某种方式转换SQL Server查询输出?
HostName ServiceName Name count
NULL NULL Received 24
canws82 MyBJE Allocated 4
canws82 MyBJE Scheduled 3
canws82 MyBJE Running 3
NCBJE1 MyBJE Running 3
NCBJE3 MyBJE Running 3
NCBJE9 MyBJE Allocated 37
NCBJE9 MyBJE Scheduled 3
NCBJE9 MyBJE Running 3
现在我被困试图找出如何将这个输出转换成
HostName ServiceName Received Allocated Scheduled Running
NULL NULL 24 0 0 0
canws82 MyBJE 0 4 3 3
NCBJE1 MyBJE 0 0 0 3
NCBJE3 MyBJE 0 0 0 3
NCBJE9 MyBJE 0 37 3 3
我甚至不知道这个转换的名称,所以如果有人请随时编辑标题(并删除这句话:-))。
任何想法?
P.S.
我正在使用SQL Server 2008R2。
编辑
由于蒙蒂野生现在我知道它是PIVOT我之后。所以,我想出了以下代码:
DECLARE @Tmp TABLE (HostName NVARCHAR(32), ServiceName NVARCHAR(32), Name NVARCHAR(32), count INT)
INSERT INTO @Tmp (HostName, ServiceName, Name, count) VALUES
(NULL ,NULL ,'Received' ,24),
('canws82' ,'MyBJE' ,'Allocated' ,4),
('canws82' ,'MyBJE' ,'Scheduled' ,3),
('canws82' ,'MyBJE' ,'Running' ,3),
('NCBJE1' ,'MyBJE' ,'Running' ,3),
('NCBJE3' ,'MyBJE' ,'Running' ,3),
('NCBJE9' ,'MyBJE' ,'Allocated' ,37),
('NCBJE9' ,'MyBJE' ,'Scheduled' ,3),
('NCBJE9' ,'MyBJE' ,'Running' ,3)
;WITH pivoted AS (
SELECT HostName, ServiceName, Received, Allocated, Scheduled, Running FROM @Tmp
PIVOT (SUM(count) FOR Name IN (Received, Allocated, Scheduled, Running)) as pvt
)
SELECT HostName, ServiceName, SUM(ISNULL(Received, 0)) Received, SUM(ISNULL(Allocated, 0)) Allocated, SUM(ISNULL(Scheduled, 0)) Scheduled, SUM(ISNULL(Running, 0)) Running
FROM pivoted
GROUP BY HostName, ServiceName
它确实产生了预期的结果。不过,我有强烈的感觉,我的代码不是最好的解决方案。我相信有更好的方法。
EDIT 2
我真正的SQL代码是一个有点不同。那就是:
;WITH raw AS (
SELECT AllocatedAgentHostName, AllocatedAgentServiceName, Status, COUNT(1) count
FROM BackgroundJobWork bjw
WHERE Status < 100
GROUP BY AllocatedAgentHostName,AllocatedAgentServiceName,Status
), data AS (
SELECT raw.*, wsn.Name
FROM raw
JOIN WorkStatusName wsn ON raw.Status = wsn.Id
), pivoted AS (
SELECT AllocatedAgentHostName, AllocatedAgentServiceName, Received, Allocated, Scheduled, Running FROM data
PIVOT (SUM(count) FOR Name IN (Received, Allocated, Scheduled, Running)) as pvt
)
SELECT * FROM pivoted
ORDER BY AllocatedAgentHostName, AllocatedAgentServiceName
运行该查询产生的输出如下:
AllocatedAgentHostName AllocatedAgentServiceName Received Allocated Scheduled Running
NULL NULL 24 NULL NULL NULL
canws82 MyBJE NULL 4 NULL NULL
canws82 MyBJE NULL NULL 3 NULL
canws82 MyBJE NULL NULL NULL 3
NCBJE1 MyBJE NULL NULL NULL 3
NCBJE3 MyBJE NULL NULL NULL 3
NCBJE9 MyBJE NULL 37 NULL NULL
NCBJE9 MyBJE NULL NULL 3 NULL
NCBJE9 MyBJE NULL NULL NULL 3
我不知道为什么它产生的阶梯效应,这不做作的例子与@Tmp
表发生。
编辑3
OK,我找到了原因楼梯(尽管我无法解释为什么它的原因)。我的真实代码data
有一个额外的列 - Status
,它未被选入pivoted
。不知怎的,这导致了楼梯。
+1 - 谢谢你的提示。我确实想出了一个解决方案,但这是一个尴尬的问题。我不喜欢它。 – mark
T-SQL PIVOT始终是awkard – thepirat000
我现在很好... – mark