2012-09-20 73 views
2

项目表:编写高级SQL选择

| Item | Qnty | ProdSched | 
| a  | 1  |  1  | 
| b  | 2  |  1  | 
| c  | 3  |  1  | 
| a  | 4  |  2  | 
| b  | 5  |  2  | 
| c  | 6  |  2  | 

有没有一种方法,我可以像这样使用SQL SELECT输出?

| Item | ProdSched(1)(Qnty) | ProdSched(2)(Qnty) | 
| a  |   1   |  4    | 
| b  |   2   |  5    | 
| c  |   3   |  6    | 
+1

请学习如何使用Shift键。在所有帽子打字都被认为是张嘴(而且很粗鲁)。所有小写​​字母打字都会让阅读困难。他们发明了Shift键是有原因的。谢谢。 –

+0

对不起。谢谢 – Snippet

+0

可能重复[获取ROWS作为列(SQL Server动态PIVOT查询)](http://stackoverflow.com/questions/12074939/get-rows-as-columns-sql-server-dynamic-pivot-query) – RichardTheKiwi

回答

4
SELECT Item, 
    [ProdSched(1)(Qnty)] = MAX(CASE WHEN ProdSched = 1 THEN Qnty END), 
    [ProdSched(2)(Qnty)] = MAX(CASE WHEN ProdSched = 2 THEN Qnty END) 
FROM dbo.tablename 
GROUP BY Item 
ORDER BY Item; 
+1

把我打到非支点版本 – Taryn

+1

@bluefeet,不知何故,我只知道你会在几分钟内用枢轴版扫地。当然+1。 –

10

您可以使用PIVOT这一点。如果你有一个已知的数值进行改造的,那么你可以硬编码通过静态支点的值:

select item, [1] as ProdSched_1, [2] as ProdSched_2 
from 
(
    select item, qty, prodsched 
    from yourtable 
) x 
pivot 
(
    max(qty) 
    for prodsched in ([1], [2]) 
) p 

看到SQL Fiddle with Demo

如果列数是未知的,那么你可以使用一个动态透视:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(prodsched) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT item,' + @cols + ' from 
      (
       select item, qty, prodsched 
       from yourtable 
      ) x 
      pivot 
      (
       max(qty) 
       for prodsched in (' + @cols + ') 
      ) p ' 

execute(@query) 

看到SQL Fiddle with Demo

0

让我们打这个分两个阶段。首先,虽然这不是你想要的确切格式,你可以得到你要的如下数据:

Select item, ProdSched, max(qty) 
    from Item1 
group by item,ProdSched 

现在,为了得到你想要的格式的数据,一个办法完成它的是一个PIVOT表。您可以在SQL Server中制作数据透视表,如下所示:

Select item, [1] as ProdSched1, [2] as ProdSched2 
from (Select Item, Qty, ProdSched 
     from item1) x 
Pivot (Max(qty) for ProdSched in ([1],[2])) y