2011-10-24 173 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變量 –