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

커서 임대 검색어 :

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

마지막 두 사례 문을 'Sum()'으로 붙잡아서 그룹에서 제거하십시오. – JNevill

+0

case 문 주변의 함수는 중복 된 행을 수정했지만 판매 할 총 일수는 이제 두 배가됩니다. 이 고칠 수 있습니까? – Hery0502

답변

1

I는이를 작성합니다

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 JOINWHERE 절로 INNER JOIN으로 바뀌고 있습니다. INNER JOIN 만 사용하십시오. 또한 A의 열을 기준으로 집계합니다. NULL 인 집계 열이 실제로 필요합니까?
  • 기본값이 NULL이므로 절이 CASE에 필요하지 않습니다.
  • 이 버전은 집계에 SUM()을 선택합니다. 하나의 숫자 값을 사용하면 SUM(), MIN()MAX()이 모두 동일한 결과를 반환합니다. 하지만, 일부 집계 키를 제거하려는 경우 SUM()이 더 안전하다고 생각합니다.
+0

자세한 내용을 알려 주셔서 감사합니다. 매우 유용합니다! case 문을 둘러싼 MAX 함수는 도움이되었지만 이제는 Total Days to Sell 열이 두 배로 증가했습니다. 예를 들면 : 애플은 대답을해야 할 총 10 일을 보여줍니다. 5. 두 점포가 있기 때문에 두 배가됩니까? – Hery0502

+0

@ Hery0502. . . 예, 그것이 두 배가되는 이유입니다. 나는 당신이 그 가치로 무엇을하고 싶은지 잘 모르겠습니다. . . 아마도'AVG()'가 적절한가? –

+0

판매 총 일수 열을 제거하고 상점 총액 100 & 200 열을 총계 열로 추가합니다. 도움을 주셔서 감사합니다! – Hery0502

2

우선 GROUP BY을 사용하고 있으므로 DISTINCT은 필요하지 않습니다.

원하는 결과를 얻으려면 사용중인 CASE 식에서 집계 함수를 사용해야합니다. 당신이 보여 데이터에서, 당신은 MIN, MAX 또는 SUM (심지어 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

감사합니다, Lamak! case 문에 대한 MAX는 값을 한 행으로 집계하는 데 도움이되었지만 판매 할 총 일수는 이제 두 배가됩니다. 예 : Apple이 대답 5 일 때 10을 보여줍니다. 어떻게 해결할 수 있습니까? – Hery0502