2017-04-18 87 views
0

我正在Teradata內部使用兩個表格,我試圖按商店編號,總銷售天數和每個商店編號中的總天數查詢每個活動項目。我當前的查詢設置是通過SKU提供兩行數據,而不是提供顯示適當信息的一行。JOIN和CASE重複查詢結果

表1:顯示班級編號,班級名稱,狀態和存儲數據。

Store Item Class Number Class Name   Status 
100  Apple  10   Red Fruit   Active 
200  Apple  10   Red Fruit   Active 
100  Banana  12   Yellow Fruit  Active 
200  Banana  12   Yellow Fruit  Active 
100  Pear  14   Green Fruit  Active 
200  Pear  14   Green Fruit  Active 
100  Beans  20   Green Vegetable Discontinued 
200  Beans  20   Green Vegetable Active 

表2:顯示總天店和項目出售

Store Item Total Days to sell 
100  Apple   4 
200  Apple   1 
100  Banana  2 
200  Banana  4 
100  Pear   3 
200  Pear   6 
100  Beans  NULL 
200  Beans   4 

表3:當前查詢結果

Item Class Number Class Name Total Days to sell Store 100 Store 200 
Apple  10   Red Fruit   5    4   NULL 
Apple  10   Red Fruit   5    NULL  1 
Banana 12   Yellow Fruit  6    2   NULL 
Banana 12   Yellow Fruit  6    NULL  4 
Pear  14   Green Fruit   9    3   NULL 
Pear  14   Green Fruit   9    NULL  6 
Beans  20   Green Vegetable  4    NULL  4 

下面是如何我找的數據是舉辦:

Item Class Number Class Name Total Days to sell Store 100 Store 200 
Apple  10    Red Fruit   5    4   1 
Banana 12    Yellow Fruit  6    2   4 
Pear  14    Green Fruit  9    3   6 
Beans  20    Green Vegetable 4    NULL   4 

Cur租金查詢:

SELECT DISTINCT  
    A.ITEM, 
    A.CLASS_NUMBER, 
    A.CLASS_NAME, 
    SUM(B.TOTAL_DAYS_TO_SELL), 
    CASE  
     WHEN B.STORE=100 THEN B.TOTAL_DAYS_TO_SELL 
     ELSE NULL 
     END AS STORE 100, 
    CASE  
     WHEN B.STORE=200 THEN B.TOTAL_DAYS_TO_SELL 
     ELSE NULL 
     END AS STORE 200 
FROM TABLE 1 A  
RIGHT JOIN TABLE 2 B   
ON B.ITEM=A.ITEM   
WHERE A.STATUS='ACTIVE'  
GROUP BY   
    A.ITEM, 
    A.CLASS_NUMBER, 
    A.CLASS_NAME, 
    STORE 100, 
    STORE 200 
ORDER BY   
    A.CLASS_NUMBER ASC; 

請讓我知道如果您有任何有關的信息

感謝任何問題!

+1

在最後兩個case語句周圍貼上一個'Sum()',並將它們從您的組中取出。 – JNevill

+0

case語句附近的函數修復了重複的行,但銷售總天數現在翻倍了。這是可以修復的嗎? – Hery0502

回答

1

我會爲這樣寫:

SELECT A.ITEM, A.CLASS_NUMBER, A.CLASS_NAME, SUM(B.TOTAL_DAYS_TO_SELL), 
     SUM(CASE WHEN B.STORE = 100 THEN B.TOTAL_DAYS_TO_SELL END) as STORE_100, 
     SUM(CASE WHEN B.STORE = 200 THEN B.TOTAL_DAYS_TO_SELL END) as STORE_200 
FROM TABLE1 A JOIN  
    TABLE2 B   
    ON B.ITEM = A.ITEM   
WHERE A.STATUS = 'ACTIVE'  
GROUP BY A.ITEM, A.CLASS_NUMBER, A.CLASS_NAME 
ORDER BY A.CLASS_NUMBER ASC; 

這實質上是Lamak的答案,但更多的社論:

  • 不要使用SELECT DISTINCT除非你真的知道你在做什麼。這幾乎是不合適的GROUP BY
  • 您有三列未被彙總;那些應該是GROUP BY中的那些。
  • 您的RIGHT OUTER JOIN正在由WHERE條款變成INNER JOIN。只需使用INNER JOIN即可。此外,您按A中的列彙總。你真的想要聚合列是NULL
  • CASE上不需要ELSE子句,因爲默認值是NULL
  • 該版本選擇SUM()作爲聚合。使用一個數值,SUM(),MIN()MAX()都返回相同的東西。但是,我認爲SUM()更安全,以防您想要刪除某些聚合密鑰。
+0

謝謝您的詳細要點,非常有幫助!圍繞案例陳述的MAX函數有所幫助,但現在Total Days to Sell列的數量翻了一番。例如:蘋果顯示答案應該是5的總共有10天。是否因爲有兩家商店而增加一倍? – Hery0502

+0

@ Hery0502。 。 。是的,這就是它爲什麼翻倍的原因。我不確定你想用價值做什麼。 。 。也許'AVG()'是合適的? –

+0

我將刪除Total Days to Sell列,並將商店100和200列添加爲總計列。感謝您的幫助! – Hery0502

2

首先,不需要DISTINCT,因爲您使用的是GROUP BY

對於所需的結果,您需要在所使用的CASE表達式上使用聚合函數。從你表現的數據,你可以使用MINMAXSUM(甚至AVG):

SELECT DISTINCT  
    A.ITEM, 
    A.CLASS_NUMBER, 
    A.CLASS_NAME, 
    SUM(B.TOTAL_DAYS_TO_SELL), 
    MIN(CASE  
      WHEN B.STORE=100 THEN B.TOTAL_DAYS_TO_SELL 
      ELSE NULL 
     END) AS STORE 100, 
    MIN(CASE  
      WHEN B.STORE=200 THEN B.TOTAL_DAYS_TO_SELL 
      ELSE NULL 
     END) AS STORE 200 
FROM TABLE 1 A  
RIGHT JOIN TABLE 2 B   
ON B.ITEM=A.ITEM   
WHERE A.STATUS='ACTIVE'  
GROUP BY   
    A.ITEM, 
    A.CLASS_NUMBER, 
    A.CLASS_NAME 
ORDER BY   
    A.CLASS_NUMBER ASC; 
+0

謝謝拉瑪克!圍繞案例陳述的MAX幫助將這些數值合併成一行,但現在銷售的總天數翻倍。例如:當答案是5時,Apple顯示10,我該如何解決這個問題? – Hery0502