2014-03-13 100 views
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

您正在寻找的术语是“Pivot”。看看the TechNet Using PIVOT and UNPIVOT page,如果你仍然不明白,有人可能会进一步帮助。

+0

+1 - 谢谢你的提示。我确实想出了一个解决方案,但这是一个尴尬的问题。我不喜欢它。 – mark

+0

T-SQL PIVOT始终是awkard – thepirat000

+0

我现在很好... – mark