sqlite 如果构造该行时使用的和(X)返回NULL,则排除该行

33qvvth1  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(137)

我正在试图操纵一个艺术品和它们所存储的收藏的数据库。我想要的是显示所有收藏的名称、其中的艺术品数量和所有艺术品的价格总和,但需要注意的是,如果价格总和返回为空,则我希望将该收藏排除在印刷品之外。有些艺术品列出了价格,有些则设置为零。
这是我的代码,我还没有想出一种方法来执行该警告而不引入意外行为。

SELECT COLLECTION.NAME, COUNT(ARTWORK.ARTWORKID), SUM(ARTWORK.PRICE)
FROM ARTWORK JOIN COLLECTION ON ARTWORK.COLLECTIONID = COLLECTION.COLLECTIONID
WHERE SUM(PRICE) IS NOT NULL
GROUP BY COLLECTION.NAME
ORDER BY COLLECTION.NAME;

我知道第三行引入了一个错误,这是我所能做的最好的展示我的思维过程。如果排除第三行,则返回预期的输出,但某些集合的总和为空的情况除外。

hk8txs48

hk8txs481#

首先,请注意sum()返回组中NOT-NUUL值的总和,因此只有当集合的所有价格都为空时,它才会返回空。如果一个图稿的价格为空,但同一集合中的其他图稿的值不为空,则sum()不为空。
如果这是您想要的结果,您只需使用HAVING子句而不是WHERE:

SELECT COLLECTION.NAME, COUNT(ARTWORK.ARTWORKID), SUM(ARTWORK.PRICE)
FROM ARTWORK JOIN COLLECTION ON ARTWORK.COLLECTIONID = COLLECTION.COLLECTIONID
GROUP BY COLLECTION.NAME
HAVING SUM(PRICE) IS NOT NULL
ORDER BY COLLECTION.NAME;

相反,如果您想要排除至少包含空定价图稿的收藏:

SELECT COLLECTION.NAME, COUNT(ARTWORK.ARTWORKID), SUM(ARTWORK.PRICE)
FROM ARTWORK JOIN COLLECTION ON ARTWORK.COLLECTIONID = COLLECTION.COLLECTIONID
GROUP BY COLLECTION.NAME
HAVING COUNT(PRICE) = COUNT(*)
ORDER BY COLLECTION.NAME;

Count(Price)计算非空价格的数量,而count(*)计算集合中的总行数,因此只有当所有价格都不为空时,它们才相等。

相关问题