Этот вопрос касается SQL Azure. У меня есть набор данных для различных цен на сырьевые товары по годам и цена за единицу, например:

Рис - 2007 - 0,5
Рис - 2007 - 0,3
Рис - 2007 - 0,8
Пшеница - 2006 - 1,1
Пшеница - 2006 - 1,4
так далее

Как я могу создать сводную таблицу, которая дает мне максимальную и минимальную цену, уплачиваемую за каждый год для каждого товара? Я знаю, как создать сводную таблицу, которая дала бы мне что-то вроде среднего - это довольно просто. Но мне нужно, чтобы в моем «основном» сводном столбце был год, а затем каждый год имел бы свои 2 «подстолбца» для МИН и МАКС цены, и я не совсем уверен, как это сделать. Помощь!

0
Unknown Coder 4 Апр 2013 в 19:49
2
Не беспокойтесь, @bluefeet появится примерно через 60 секунд, чтобы дать вам ответ. ;)
 – 
Eric J. Price
4 Апр 2013 в 19:50

1 ответ

Лучший ответ

Если я чего-то не упустил в вашем объяснении, вы можете легко сделать это без функции PIVOT:

select product,
  year,
  min(price) MinPrice,
  max(price) MaxPrice
from yourtable
group by product, year

См. SQL Fiddle с демонстрацией.

Если вам нужны данные в отдельных столбцах, это можно сделать несколькими способами.

Агрегатная функция с CASE:

select product,
  min(case when year=2006 then price else 0 end) [2006_MinPrice],
  max(case when year=2006 then price else 0 end) [2006_MaxPrice],
  min(case when year=2007 then price else 0 end) [2007_MinPrice],
  max(case when year=2007 then price else 0 end) [2007_MaxPrice]
from yourtable
group by product

См. SQL Fiddle с демонстрацией

UNPIVOT и PIVOT:

UNPIVOT используется для преобразования данных столбца в строки. Оказавшись в строках, вы можете создать новые столбцы с годом, а затем повернуть их:

select *
from
(
  select product, 
    cast(year as varchar(4))+'_'+col as piv_col,
    value
  from
  (
    select product,
      year,
      min(price) MinPrice,
      max(price) MaxPrice
    from yourtable
    group by product, year
  ) x
  unpivot
  (
    value for col in (minPrice, maxPrice)
  ) u
) d
pivot
(
  max(value)
  for piv_col in ([2006_MinPrice], [2006_MaxPrice],
                  [2007_MinPrice], [2007_MaxPrice])
) piv;

См. SQL Fiddle с демонстрацией. Это дает результат:

| PRODUCT | 2006_MINPRICE | 2006_MAXPRICE | 2007_MINPRICE | 2007_MAXPRICE |
---------------------------------------------------------------------------
|    Rice |             0 |             0 |           0.3 |           0.8 |
|   Wheat |           1.1 |           1.4 |             0 |             0 |

Если у вас неизвестное количество лет, вы также можете реализовать динамический sql.

3
Taryn 4 Апр 2013 в 21:58
Да, это довольно очевидный ответ. Но это сводная таблица с годами в столбцах. Таким образом, выходные столбцы будут иметь вид: Товар-2006-2007-2008 и т. Д., А затем строки будут минимальным и максимальным для каждого года. Приведенный выше ответ даст мне результаты в табличном формате, мне это нужно как сводная таблица.
 – 
Unknown Coder
4 Апр 2013 в 21:41
Можете ли вы отредактировать свой OP и показать, как вы хотите, чтобы минимальный / максимальный отображался с годом? Это будет легче понять.
 – 
Taryn
4 Апр 2013 в 21:45
Смотрите мою правку, я добавил несколько версий, которые разделяют годы на столбцы.
 – 
Taryn
4 Апр 2013 в 21:58
Спасибо! Я думаю, что второй пример (min max с case) правильный. Думаю, это не точка опоры, это должно дать мне то, что мне нужно. Я попробую это. Я ценю это.
 – 
Unknown Coder
4 Апр 2013 в 23:02
Рад помочь, это все еще точка опоры. Это просто то, что они раньше называли опорой плохого мэйна. :)
 – 
Taryn
4 Апр 2013 в 23:04