Сводные данные SQL с динамическим списком столбцов - PullRequest
1 голос
/ 25 октября 2011

Я застрял на конкретной проблеме, надеюсь, кто-нибудь может мне помочь. У меня есть четыре таблицы Product, ProductType, Orders. Я хочу просматривать данные из таблицы «Заказы», ​​но хочу просматривать их так, чтобы каждый день данные группировались по сумме количества продуктов, проданных за каждый день по каждому типу продукта. Пожалуйста, просмотрите структуру таблицы. Я попытался получить группы продуктов в виде списка массивов и могу суммировать количество продуктов для каждой группы типов продуктов, но не могу понять, как это можно увидеть так, чтобы каждая группа типов продуктов отображалась как сумма для каждой даты в виде отдельного столбца, мне сказали, что Pivot или кросс-таблица может это сделать, я смог создать массив SQL с разделителями-запятыми, но для того, чтобы найти данные в списке типов продуктов, мне пришлось создать временная таблица и использовать функцию, описанную здесь http://databases.aspfaq.com/database/how-do-i-simulate-an-array-inside-a-stored-procedure.html, чтобы найти совпадающие значения ... но не знаете, как получить желаемое представление, я должен использовать массив или какой-либо динамический список, потому что я не знаю, сколько столбцов группы типов продуктов может быть?

Ваша помощь будет принята с благодарностью, заранее спасибо !!

Таблица заказов

Order ID  ProductID   Quantity  Date      CustomerID    Store_locID
  1          1           5     10/01/2011      12          1
  2          2           10    10/03/2011      4           1
  3          3           8     10/03/2011      5           1
  4          4           11    10/05/2011      4           2
  5          5           5     10/05/2011      14          2
  6          6           8     10/06/2011      3           3

Таблица продуктов

ProductID    Name      Desc         ProdTypeID 
  1          Bananas   Chiquita         1
  2          Apples    Green Apples     1
  3          Grapes    Green Grapes     1
  4          Potatoes  Idaho potatoes   2
  5          Brocolli  Green Vrocolli   2
  6          Plates    Paper Plates     3

Таблица Тип продукта

 TypeID      Name       Desc   
  1          Fruits     Fresh Fruits
  2          Vegetables Fresh Veggies
  3          Kitchen    Kitchen stuff 

Расположение магазинов таблиц

loc_id      city        state
   1        Atlanta     GA
   2        New york    NY
   3        Chicago     IL 

Требуемый вид Товары, которые продаются, суммируются и группируются по типу продукта в каждый день * Пожалуйста, имейте в виду, что это всего лишь пример, поэтому я не могу сгруппировать по гордому типу ID (1,2,3), в моей реальной проблеме могут быть сотни Группы типов продуктов, поэтому список столбцов должен создаваться динамически

   City      Date     Fruits (sum)    Vegetables(sum)  Kitchen(sum)   Group4*    Group5*      

  Atlanta    10/01/2011   5                  0               0           0
  Atlanta    10/03/2011   18                 0               0           0
  New York   10/05/2011   0                  16              0           0     
  Chicago    10/06/2011   0                  0               8           0

1 Ответ

3 голосов
/ 25 октября 2011

Вот как бы я это сделал:

/*
create table ##order  ( ID int, ProdID int, Quantity int, [Date] date, CustID int, StoreID int );
insert into ##order values (1,1,5,'2011-01-10' ,12,1), (2,2,10,'2011-03-10',4 ,1), (3,3,8,'2011-03-10' ,5 ,1), (4,4,11,'2011-05-10',4 ,2), (5,5,5,'2011-05-10' ,14,2), (6,6,8,'2011-06-10' ,3 ,3);
create table ##product (ProdID int, ProdName varchar(64), ProdDesc varchar(255), ProdType int);
insert into ##product values (1,'Bananas','Chiquita',1), (2,'Apples','Green Apples',1), (3,'Grapes','Green Grapes',1), (4,'Potatoes','Idaho potatoes',2), (5,'Brocolli','Green Brocolli',2), (6,'Plates','Paper Plates',3);
create table ##ProdType (TypeID int, Name varchar(64), [Desc] varchar(255));
insert into ##ProdType values (1,'Fruits','Fresh Fruits'),(2,'Vegetables','Fresh Veggies'),(3,'Kitchen','Kitchen stuff');
create table ##loc (loc_id int, city varchar(50), [state] varchar(50))
insert into ##loc values(1, 'Atlanta','GA'), (2, 'New york', 'NY'), (3, 'Chicago', 'IL');
*/

declare @cmd varchar(max), @columns varchar(max)
set @columns = ''


select @columns = @columns + '['+Name+'],' from ##ProdType order by name asc
select @columns = substring(@columns, 0, len(@columns))

set @cmd = '
select city, date,'+@columns+' from
(
select   
   ct.city,
   ord.Date,
   pt.Name,
   ord.Quantity
from 
   ##order ord 
   join ##product pr on ord.ProdID = pr.ProdID
   join ##ProdType pt on pr.ProdType = pt.TypeID
   join ##loc ct on ord.StoreID = ct.loc_id
)date_to_pivot
PIVOT
(
SUM(Quantity) for Name in ('+@columns+')
)PIVOTED_DATA'   

exec (@cmd)

Вот расширение, использующее операторы case:

set @columns = ''

select @columns = ''
select @columns = @columns + 'sum(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_SUM,' from ##ProdType order by name asc
select @columns = @columns + 'count(case when pt.Name = '''+Name+''' then ord.Quantity else 0 end) as '+Name+'_COUNT,' from ##ProdType order by name asc
select @columns = substring(@columns, 0, len(@columns))


set @cmd = '
select   
   ct.city,
   ord.Date,   '
   +@columns+
'   
from 
   ##order ord 
   join ##product pr on ord.ProdID = pr.ProdID
   join ##ProdType pt on pr.ProdType = pt.TypeID
   join ##loc ct on ord.StoreID = ct.loc_id
group by
   ct.city,
   ord.Date'

   exec (@cmd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...