SQL

2017-10-13 1 views
1

이 같은 조합을 가지고 노동 조합의 결과를 필터링 :SQL

(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price > 0 
GROUP BY prod.id, DATE(timestamp)) 
UNION 
(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price = 0 
GROUP BY prod.id, DATE(timestamp)) 

문제 : 날짜가있는 경우

제품이 우리가 가격 = 0과 가격> 0 함께 사용할 수 있습니다 노동 조합 결과에서 두 개의 행을 가져옵니다.

같은 날짜에 같은 제품에 대해 가격> 0 결과가 나오면 price = 0 결과가 무시됩니다.

해결을 위해 트릭을 공유 할 수있는 사람은 누구입니까?

답변

1

나는 그것을 "속임수"라고 부르지 않을 것입니다. UNIDE의 price = 0 부분의 WHERE 절에 조건을 추가하면 가격이 0보다 큰 제품을 걸러 낼 수 있습니다.

직접 NOT EXISTS() 함수를 사용하면되지만 다른 여러 가지가 있습니다. 이것을하는 방법.

0

당신은 "단가가"0과 단 하나의 가격으로 그룹화 되길 원하십니까? 그렇다면 첫 번째 그룹을 임시 테이블에 넣습니다. 제품 ID가 임시 테이블에없는 두 번째 그룹에 대한 선택을 수행하십시오.

CREATE TABLE #HASPRICE (prod.id INT, price Decimal, timestamp DATE) 

INSERT INTO #HASPRICE 
SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price > 0 
GROUP BY prod.id, DATE(timestamp) 

INSERT INTO #HASPRICE 
SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price = 0 AND prod.id not in (select prod.id from #HASPRICE) 
GROUP BY prod.id, DATE(timestamp)) 

하지 않을 경우, 다음이 작동

(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price >= 0 
GROUP BY prod.id, DATE(timestamp))