2017-10-13 88 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,那么价格= 0的结果将被忽略。

任何人都可以分享伎俩来解决这个问题吗?

回答

1

我不会称之为“诡计”。只需在UNION的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))