2011-10-24 170 views
1

我陷入了一个特定的问题,我希望有人能帮助我。我有四个表格Product,ProductType,Orders。我想从订单表中查看数据,但希望以每天根据每种产品类型下每天销售的产品数量的总和对数据进行分组的方式来查看数据。请查看表格结构,我尝试将产品组作为数组列表,并且能够将每个产品类型组的产品数量累加起来,但无法弄清楚如何以每种产品类型组显示为每个日期的总和作为一个单独的列,我被告知枢轴或交叉表查询可以做到这一点,我能够在SQL中创建逗号分隔的数组,但为了找到产品类型列表中的数据,我必须创建一个临时表和使用这里描述的功能 http://databases.aspfaq.com/database/how-do-i-simulate-an-array-inside-a-stored-procedure.html找到匹配的值...但不知道如何获得我想要的视图,我必须使用一个数组或一些动态列表,因为我不知道有多少产品类型组列是?带有动态列列的SQL数据透视表数据

您的帮助将不胜感激,在此先感谢!

表顺序

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 
+0

你用什么? MySQL或MS SQL Server? – Devart

+0

我正在使用SQL Server – Shokwave

+0

好。我想用MySQL来帮助你;-) – Devart

回答

3

这里是我会怎么做:

/* 
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,'[email protected]+' 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 ('[email protected]+') 
)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, ' 
    [email protected]+ 
' 
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) 
+0

嗨米歇尔感谢您的回复,我收到了您的建议,为数量工作,但我有另外一个或两个问题:) 1)如果我想显示除了数量之外的另一列的总和只是为了说明SUM(Store_locID)我怎么能做到这一点,我试图在('+ @ columns +')中为('+ @ columns +'),SUM(Store_locID)for Name中的名称执行PIVOT(SUM(Quantity))) PIVOTED_DATA',但它不允许我添加任何额外的列,我希望看到的总和? 2)我怎样才能使用别名或重命名总数量列的前蔬菜(总和),水果(总和)等 – Shokwave

+0

你不能这样做在一个PIVOT运营商,限制是你可以只使用一个聚合。你可以做的是执行2条语句,然后根据日期和产品类型加入它们。或者你可以使用case语句来修改PIVOT操作符。 –

+0

我添加了case stataments,所以你只需要将所需的聚合添加到@column变量 –