2014-12-04 50 views
1

我有以下表结构SQL Server语句输出

TicketID Status Duration 
----------------------------- 
1234   8  2 
1233   8  10 
1232   4  5 
1231   8  12 
1230   4  50 
  • 状态8所表示关闭
  • 状态4指开

它需要有输出方式如下。请只做那些需要的。如果可能的话,我希望它在一个单一的SQL查询。

请帮助我以下列方式生成输出。

Status Closed (sum) Open(Sum) 
--------------------------------- 
    8  24    0 
    4  0    55 
+3

欢迎使用StackOverflow:如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后在编辑器工具栏上单击“代码示例”按钮(“{}”)格式和语法突出显示它! – 2014-12-04 06:52:53

+1

你有什么尝试吗?阅读http://msdn.microsoft.com/en-us/library/ms177673.aspx和http://msdn.microsoft.com/en-us/library/ms177673.aspx – 2014-12-04 06:56:49

+0

@SandipkTatva您可能正在寻找'GROUP如果你的实际情况比你发布的内容更复杂(比如现实中有更多的状态等),你可以在http://technet.microsoft.com/en-us上找到“BY”(上面注释中的链接)或“PIVOT”。 /library/ms177410%28v=sql.105%29.aspx和http://stackoverflow.com/questions/24470/sql-server-pivot-examples – Ruslan 2014-12-04 07:45:14

回答

0

一个case表达可以过滤掉不需要的值,所以这可以在一个单一的汇总查询来完成:

SELECT status, 
     SUM (CASE status WHEN 8 THEN duration ELSE 0 END) AS closed_sum, 
     SUM (CASE status WHEN 4 THEN duration ELSE 0 END) AS open_sum 
FROM  my_table 
GROUP BY status 
0
select status 
     , sum(case when status = 4 then Duration else 0 end) as [Open(sum)] 
     , sum(case when status = 8 then Duration else 0 end) as [Closed(sum)] 
from @test 
group by status 
order by status desc 
0
WITH T AS (SELECT Status, SUM(Duration) AS Duration FROM Table1 GROUP BY Status) 
SELECT Status, Duration, 0 FROM T WHERE Status = 8 
UNION ALL 
SELECT Status, 0, Duration FROM T WHERE Status = 4 
+0

生成EXACT预期输出。我知道WITH部分提供了所有需要的信息。 UNION部分是在问题中产生EXPECTED输出。请参阅问题中的格式。 – CrimsonKing 2014-12-04 07:56:45

0

使用UNION ALL

SELECT [Status],sum([Duration]) [Closed(sum)], '0' as [Open(Sum)] 
      from [dbo].[tblx] 
      where [Status]=8 
      GROUP BY [Status] 


UNION all    
       SELECT [Status], '0' as [Closed(sum)],sum([Duration]) [Close(sum)] 
      from [dbo].[tblx] 
      WHERE [Status]=4 
      GROUP BY [Status] 

enter image description here