sql - T-SQL 获取所有年份从 - 到
问题描述
我正在尝试从数据库中查找每个商店每年的销售额列表。但我也想打印所有销售额为 0 的年份(对于某些年份/商店,我的数据库中将没有数据)
我已经完成了以下过程,但它只返回 Years 和具有非零值的商店。
SELECT YEAR(temp.INVOICE_DATE) AS Year, Shop.Name, SUM(temp.QTY * Product.Price) AS Total
FROM (
SELECT pci.INVOICE_ID, ci.STORE_ID, ci.INVOICE_DATE, pci.PRODUCT_ID, pci.QTY
FROM [Product_Customer Invoice] pci, [Customer Invoice] ci
WHERE pci.INVOICE_ID = ci.INVOICE_ID
)AS temp, Product, Shop
WHERE Product.PRODUCT_ID = temp.PRODUCT_ID AND Shop.STORE_ID = temp.STORE_ID
GROUP BY YEAR(temp.INVOICE_DATE), Shop.Name
ORDER BY Year ASC
我得到以下结果
我想询问任何想法如何包括 0 多年或没有任何销售的商店
解决方案
使用 across join
生成行,然后left join
引入所需的数据:
SELECT y.Year, s.Shop.Name,
COALESCE(SUM(pci.QTY * p.Price), 0) AS Total
FROM Shop s CROSS JOIN
(SELECT DISTINCT invoice_date as year FROM [Product_Customer Invoice]
) y LEFT JOIN
[Product_Customer Invoice] pci
ON YEAR(pci.invoice_date) = y.year AND
pci.store_id = s.store_id LEFT JOIN
Product p
ON pci.PRODUCT_ID = p.PRODUCT_ID
GROUP BY y.year, s.name
ORDER BY y.year, s.name;
请注意,这也修复了您的join
语法并删除了不必要的子查询。
这假设您想要的所有年份都在[Product_Customer Invoice]
. 如果您想要一组不同的年份,请使用 明确列出它们VALUES()
,使用递归 CTE 生成它们,或使用日历表。
推荐阅读
- python - Python:在过去 3 天的滚动中计算唯一值
- laravel - 运行“composer global require laravel/valet”时出现“database/seeds”错误
- android - Flutter 应用中的短信收发
- python - 编辑 cookie 以处理到期日期
- octave - 尝试使用 textscan 加载数据时出现问题
- java - 我想在运行 catch 块时打印无效输入,但它没有发生。请帮帮我
- python - 使用熊猫条件根据另一个数据帧获取一个数据帧中“单元格”的值
- python - 如何在 Python tkinter 中使问卷可滚动?
- r - shapefile的ggplot自定义类别图例
- django - 为什么 Django 不通过 ListView 将 ImageField 数据传递给模板?