2017-01-13 40 views
0
Table structures 

Table Products : 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
1 |102 | 0 |14.95 | 29.65 
2 |103 | 1 |13.95 | 32.65 
3 |104 | 2 |12.36 | 42.12 
4 |105 | 3 |10.24 | 23.11 
5 |106 | 4 |19.57 | 27.16 
6 |102 | 0 |57.26 | 26.98 
7 |103 | 3 |43.26 | 26.98 
8 |104 | 4 |10.26 | 26.98 
9 |105 | 1 |9.26 | 26.98 
10 |105 | 5 |11.26 | 46.98 


Same table separated into two tables by Type 
Premium products : Type = (0, 1, 2) 
Basic products : Type = (3, 4, 5) 

Table Products : Products with Type (0,1,2) 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
1 |102 | 0 |14.95 | 29.65 
2 |103 | 1 |13.95 | 32.65 
3 |104 | 2 |12.36 | 42.12 
6 |102 | 0 |57.26 | 26.98 
9 |105 | 1 |9.26 | 26.98 

Table Products : Products with Type (3,4,5) 
============================================= 
ID | Store | Type | Cost | NetCost | 
============================================= 
4 |105 | 3 |10.24 | 23.11 
5 |106 | 4 |19.57 | 27.16 
7 |103 | 3 |43.26 | 26.98 
8 |104 | 4 |10.26 | 26.98 
10 |105 | 5 |11.26 | 46.98 

我要總結數,成本和NetCost基於由商店分組類型的所有產品。 結果應如下所示:轉換多個子查詢轉換爲連接(連接表本身)

Table of totals: (B = Basic, P= Premium) 
================================================================= 
Store | B Cnt |B Cost | B NetCost | P Cnt | P Cost | P NetCost | 
================================================================= 
102 
103 
104 
105 
106 

我可以通過使用主查詢與下面所示的子查詢實現上述,是否有更 有效的連接(接合表本身等)我可以做那會達到上面的表格(總數)?

子查詢,我會放在一個主查詢:

SELECT 
    count(*) 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 

SELECT 
    SUM(Cost), 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 

SELECT 
    SUM(NetCost) 
FROM 
    Products prod_prem 
WHERE 
    (prod_prem.Type = 0 OR prod_prem.Type = 1 OR prod_prem.Type = 2) 


SELECT 
    count(*) 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 


SELECT 
    SUM(Cost), 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 


SELECT 
    SUM(NetCost) 
FROM 
    Products prod_basic 
WHERE 
    (prod_prem.Type = 3 OR prod_prem.Type = 4 OR prod_prem.Type = 5) 

回答

2

您可以在單一的查詢使用Conditional Aggregation

SELECT Store, 
     [B Cnt] = Count(CASE WHEN Type IN (3, 4, 5) THEN 1 END), 
     [B Cost] = Sum(CASE WHEN Type IN (3, 4, 5) THEN Cost ELSE 0 END), 
     [B NetCost] = Sum(CASE WHEN Type IN (3, 4, 5) THEN NetCost ELSE 0 END), 
     [P Cnt] = Count(CASE WHEN Type IN (0, 1, 2) THEN 1 END), 
     [P Cost] = Sum(CASE WHEN Type IN (0, 1, 2) THEN Cost ELSE 0 END), 
     [P NetCost] = Sum(CASE WHEN Type IN (0, 1, 2) THEN NetCost ELSE 0 END) 
FROM Products 
GROUP BY Store 
+0

這看起來更清潔,更容易理解,我會在今天晚些時候嘗試,如果能解決問題,請接受您的答案。格拉西亞斯。 – Fabii

0

你應該有帶IsPremium位列ProductType表做到這一點。這樣,當類型6,7,8出現時,您不必對代碼進行可怕的錯誤維護 - 您只需在類型表中插入新行。

+0

我不保留表格,所以我必須和他們一起工作。 – Fabii

+0

Gotcha。如果這存在於存儲過程中,則可以在過程中將其創建爲臨時表,因此「高級」僅在proc中的一個位置定義,而不是多個。可能比它的價值更麻煩,只是一個建議 –

+0

謝謝,我會牢記這一點。 – Fabii