2011-10-24 13 views
1

私は誰かが私を助けてくれることを望む特定の問題に固執しています。私は4つのテーブルProduct、ProductType、Ordersを持っています。 OrdersテーブルからDataを表示したいが、毎日、各ProductTypeの下で毎日販売される製品数の合計でデータをグループ化する方法で表示したい。テーブルの構造を見て、私は配列リストとしてProductグループを取得しようとしましたが、各製品タイプグループの製品数量を合計できますが、各producttypeグループが表示される方法でこれを表示する方法を理解できません私はピボットまたはクロスタブのクエリがこれを行うことができると言われた、私はコンマで区切られた配列を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 

希望の商品表示されている商品商品が一日に集計され、グループ分けされています。*これは単なるサンプルなので、私の実際の問題では数十種類の製品がある可能性があります。列のリストがここに動的

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

OKを使用しています。私は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

こんにちはMichalあなたの返事をありがとう、私は数量のために働くためにあなたの提案を持っていましたが、別の質問または2があります:) 1)私は数量以外の別の列の合計を表示する場合( '+ @ columns +')のName( '+ @ columns +')のNameにはPIVOT(SUM(Quantity))、SUM(Store_locID)を実行しようとしました。 PIVOTED_DATA 'しかし、それは私が合計を見たいと思う追加の列を追加することはできません? 2)Ex Veggies(Sum)、Fruits(Sum)などのSum量の列の名前を変更するにはどうすればよいですか? – Shokwave

+0

1つのPIVOT演算子ではできませんが、1つの集計しか使用できないという制限があります。あなたができることは、このステートメントの2つを実行し、日付と製品タイプに基づいてそれらを結合することです。あるいは、case文を使用してPIVOT演算子をリライトすることもできます。 –

+0

ケースステートメントを追加しましたので、@ column変数 –

関連する問題