【问题标题】:T-SQL Get all years from - toT-SQL 获取所有年份从 - 到
【发布时间】:2019-04-18 17:19:38
【问题描述】:

我正在尝试从数据库中查找每个商店每年的销售额列表。但我也想打印所有销售额为 0 的年份(对于某些年份/商店,我的数据库中将没有数据)

我已经完成了以下过程,但它只返回年份和商店的非零值。

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 包括多年或尚未完成任何销售的商店

【问题讨论】:

  • 你试过GROUP BY ALL YEAR(temp.INVOICE_DATE), Shop.Name吗? (注意“全部”)

标签: sql sql-server database tsql


【解决方案1】:

使用cross 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 生成它们,或者使用日历表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多