2012-03-13 25 views
0

我试图创建一个查询,将输出总数,以及在SQL-Server总数的子集。我可以想到通过子查询来实现这一点的方法,但这似乎是一大堆工作。有没有更快的方式来写这个查询?SQL Server - 能够在选择中传递子集参数?

Table name: orders 


OrderID Date   Type   OrderSize 
1   1/1/2012  Electronics $282.02 
2   1/1/2012  Electronics $1,000.56 
3   1/1/2012  Books   $17.25 
4   1/1/2012  Books   $10.00 

什么我试图输出应该是这样的:

Date  ElectronicOrders ElectronicOrderSize BookOrders BookOrderSize 
1/1/2012 2     $1,282.58    2   $27.25 

我可以创建一个临时表,然后再运行2个更新查询 - 1 WHERE Type = 'Electronics'和1 WHERE Type = 'Books'

我在某些编程语言(例如R)中看到的是变量子集的能力。有没有办法让我这样说:

count(OrderID, Type = 'Electronics) as ElectronicOrders, sum(OrderSize, Type = 'Electronics') as ElectronicOrderSize 

还是我坚持subqueriesUPDATE queries

+1

这看起来像一个PIVOT,但知道您是否知道所有潜在类别非常重要。 – 2012-03-13 01:30:23

+0

我知道所有类别...我不熟悉'PIVOT' ...现在搜索。 – mikebmassey 2012-03-13 01:34:19

+0

枢轴会工作,我想。我可以看到如何进行1次计算,例如count(*),但不能同时计数(*)和sum(*)。 – mikebmassey 2012-03-13 01:36:41

回答

3

我还没有得到新的PIVOT语法在我的脑海中有意义,但您可以通过分组来做一个数据透视表,并且在case语句中使用聚合函数。

select [date], sum(case when type = 'Electronics' then (ordersize) else 0 end) AS ElectronicsSum, 
sum(case when type = 'Electronics' then 1 else 0 end) AS ElectronicsCount, 
sum(case when type = 'Books' then (ordersize) else 0 end) AS BooksSum, 
sum(case when type = 'Books' then 1 else 0 end) AS BooksCoumt 
from orders 
group by [date] 

我把fiddle事情了对它进行测试。如果Aaron B.提出了一个解决方案,给他答案的功劳,我可能甚至都没有认识到它的主观性。

+1

+1这可能是我会做的。 PIVOT可能有更优雅的方式(也许是两个PIVOTS?),但我还没有掌握语法。 – 2012-03-13 02:38:56

+0

这工作正是我需要的方式。谢谢您的帮助。 – mikebmassey 2012-03-13 03:05:26