2017-04-04 190 views
2

假設我出售T恤衫,並且我有一張表格,我正在拉出售出的顏色和數量以及客戶,並且我想創建一個x軸和y軸上有100種顏色的矩陣,以便我可以確定顧客在第一張訂單上購買什麼顏色,以及他們在第二張訂單上購買什麼顏色。SQL產品矩陣

如何在創建矩陣時不寫出1000個case的語句?

首次購買表

|Customer|Color|PurchaseQty| 
---------------------------- 
| 1 |Blue |  2  | 
| 2 |Red |  1  | 
| 3 |White|  2  | 
--------------------------- 

第二份採購表

|Customer|Color|PurchaseQty| 
---------------------------- 
| 1 |Red |  1  | 
| 2 |White|  3  | 
| 3 |Blue |  1  | 
--------------------------- 
 Red  White  Blue 
-------------------------------------- 
Red |    1 
-------------------------------------- 
White|       1 
-------------------------------------- 
Blue | 1 
-------------------------------------- 

Sample

+0

是什麼紅白的邏輯是1? –

+0

如果y軸是第一次購買,x軸是第二次購買,則1位顧客在第一次購買時(不管數量)購買紅色,第二次購買時購買白色(不管數量)。 – Ally

回答

1

根據要求。我加了幾條記錄,說明分配

樣本數據首先

Customer Color PurchaseQty 
1   Blue 2 
3   White 2 
2   Red  1 
4   Red  1  -- < Added 
5   Red  1  -- < Added 

樣本數據二

Customer Color PurchaseQty 
1   Red  1 
3   Blue 1 
2   White 3 
4   Red  1  -- < Added 
5   Blue 1  -- < Added 

查詢

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Color) From #Second Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [YAxis] as [Color],Y1Axis as [Customers],' + @SQL + ' 
From (
     Select YAxis = A.Color 
       ,XAxis = B.Color 
       ,Y1Axis= count(A.Customer) over (Partition By A.Color) 
       ,Value = 1.0/count(*) over(Partition by A.Color) 
     From #First A 
     Join #Second B on (A.Customer=B.Customer) 
    ) A 
Pivot (sum(Value) For [XAxis] in (' + @SQL + ')) p' 
Exec(@SQL); 

返回 - 情況比較大小

enter image description here

爲了一個共同的大小

只需將該值設置爲... ,Value = 1.0/count(*) over() ...

enter image description here

2

動態支點的許多例子,但這裏是一個將處理您的X/Y矩陣

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Color) From #Second Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [YAxis] as [Color],' + @SQL + ' 
From (
     Select YAxis = A.Color 
       ,XAxis = B.Color 
       ,Value = 1 
     From #First A 
     Join #Second B on (A.Customer=B.Customer) 
    ) A 
Pivot (max(Value) For [XAxis] in (' + @SQL + ')) p' 
Exec(@SQL); 

返回

Color Blue Red  White 
Blue NULL 1  NULL 
Red  NULL NULL 1 
White 1  NULL NULL 
+0

如果我想要得到客戶的百分比(33%買紅回來並且白色),這似乎工作得很好,我會按客戶數量除以關鍵點嗎?或在From語句中? – Ally

+0

@現在正在與另一個SO用戶合作。如果你給我幾個,我可以調整我的答案 –

+0

這將是偉大的,謝謝! – Ally