2017-04-18 90 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