2012-09-20 78 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