我想选择2016年特定"main_category“的”销售总额“
(当年没有销售的主要类别应该显示为零)
我已经成功地选择了特定“主类别”的“销售”,使用下面的查询将所有其他"main_categories“(没有任何销售)显示为零:
SELECT
mc.name,
ISNULL(SUM(s.no_of_units * b.unit_price),0) AS tCatSales
FROM Sales s
INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
INNER JOIN Inventory inv ON inv.inventory_ID = s.inventory_ID
INNER JOIN Batch b ON b.batch_ID = inv.batch_ID
INNER JOIN Products p ON p.product_id = b.product_ID
INNER JOIN Category c ON c.category_ID = p.category_id
RIGHT JOIN Main_Category mc ON mc.cat_id = c.main_category
--WHERE YEAR(i.trans_date) = 2016
GROUP BY mc.name
--HAVING YEAR(i.trans_date)=2016但是,当我试图在2016年进一步将其隔离开来时,它不再显示“”名称,即在今年零销量的"main_category“名称,无论是WHERE子句,还是有子句。
我能想到的一件事是只提供2016年的查询发票,我试着这样做,
替换行: INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
with: INNER JOIN Invoice i ON i.invoice_ID IN (SELECT invoice_id FROM Invoice in2 WHERE Year(in2.trans_date)=2016)
哪个显示了零值的类别,但随着计算出的销售额的增加(从2069年增加到203151022.75)。
我知道这个添加有点不合逻辑,扰乱了整个内部连接,但到目前为止,这些都是我能想到或在网上找到的最接近的东西。
我重复所期望的结果是:在那一年中没有销售的主要类别应该显示为0,与给定的年份/月份/日期
发布于 2017-09-06 20:43:51
正如Sean和Eli提到的,不推荐右联接,您可以将其更改为左联接,或者使用以下子查询:
SELECT
mc.name,
tCatSales = ISNULL(
(
SELECT
SUM(s.no_of_units * b.unit_price) AS tCatSales
FROM Sales s
INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
INNER JOIN Inventory inv ON inv.inventory_ID = s.inventory_ID
INNER JOIN Batch b ON b.batch_ID = inv.batch_ID
INNER JOIN Products p ON p.product_id = b.product_ID
INNER JOIN Category c ON c.category_ID = p.category_id
WHERE mc.cat_id = c.main_category
AND YEAR(i.trans_date) = 2016
) , 0)
FROM Main_Category mc 发布于 2017-09-06 20:10:55
试试这个:
WHERE ISNULL(YEAR(i.trans_date), 1) = 2016如果在外部联接上设置简单的相等条件,它将消除空值,这会给出你想要的零值行。还请注意,类似于:
WHERE YEAR(i.trans_date) = 2016是不可接受的,请参阅here
https://stackoverflow.com/questions/41639838
复制相似问题