Напишите расширенный выбор 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

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;

Ответ 2

Вы можете использовать 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

Ответ 3

Позвольте поразить это в две фазы. Во-первых, хотя это не точный формат, который вы хотели, вы можете получить данные, которые вы запросили, следующим образом:

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