【发布时间】:2017-01-13 17:04:33
【问题描述】:
我想选择 2016 年特定“main_category”的总“销售额”
(当年没有销售额的主要类别应显示为零)
我已设法选择特定“主要类别”的“销售额”,而所有其他“主要类别”(没有任何销售额)使用以下查询显示为零:
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
但是当我尝试通过 WHERE 子句或 HAVING 子句进一步将其 2016 年 分离时,它停止显示“main_category”当年销售额为零的名称。
我能想到的一件事是只提供 2016 年的查询发票 我试图通过做类似的事情来做到这一点,
换行:
INNER JOIN Invoice i ON i.invoice_ID = s.invoice_id
与:
INNER JOIN Invoice i ON i.invoice_ID IN (SELECT invoice_id FROM Invoice in2 WHERE Year(in2.trans_date)=2016)
其中确实显示了具有零值但增加了计算销售额的类别(从 2069 到 203151022.75)。
我知道这个添加有点不合逻辑,并且会破坏整个内部连接,但到目前为止,这些是我能想到或在网络上找到的最接近的东西。
我重复期望的结果是:在该年没有销售的主要类别应显示为零,并且年份为年/月/日
【问题讨论】:
-
仅仅发布一个查询并期望其他人解决它是不可能发生的。我们需要更多信息来在这里提供任何真正的帮助。这是一个很好的起点。 spaghettidba.com/2015/04/24/… 如果您保留 where 子句的方式,您的整个查询逻辑将更改为仅返回匹配的行。我将重新开始您的整个查询并使用 Main_Category 作为您的基表。然后离开加入所有其他的东西。右连接即使是有经验的人也会感到困惑,对其他人来说却是彻头彻尾的慌乱。
-
为什么要正确加入?
标签: sql-server join group-by aggregate-functions right-join