【问题标题】:Showing month wise value when no data exists不存在数据时显示月份值
【发布时间】:2022-01-14 00:49:46
【问题描述】:

我使用 SQL Server,并且我编写了以下 SQL 查询,以便显示客户名称、城镇名称、产品、销售数量、销售年份、销售月份和经销商名称以及我在特定月份销售的数量,但是即使一个月没有数据,我也希望查询按月显示。

SELECT dbo.Customerdetl.cust_name, dbo.Towndetl.town_name, dbo.productdetl.prod_desc, dbo.SalesSummary.sales_qty, dbo.SalesSummary.year_numb, dbo.SalesSummary.month_numb,dbo.DistributorDetl.DISTNAME
FROM     dbo.SalesSummary INNER JOIN
                  dbo.productdetl ON dbo.SalesSummary.ProductCode = dbo.productdetl.ProductCode INNER JOIN
                  dbo.DistributorDetl ON dbo.SalesSummary.DistCode = dbo.DistributorDetl.DistCode INNER JOIN
                  dbo.Customerdetl ON dbo.SalesSummary.cust_code = dbo.Customerdetl.cust_code INNER JOIN
                  dbo.Towndetl ON dbo.SalesSummary.town_code = dbo.Towndetl.town_code  
WHERE  (dbo.SalesSummary.year_numb = 2021) AND (dbo.Customerdetl.cust_name = N'Janani Pharmacy') AND (dbo.productdetl.prod_desc = N'Mycotin')

我得到的结果是:

Cust_name Town Product Sales_qty Year Month Distributor_name
Janani Pharmacy HANWELLA Mycotin 10 2021 7 NEGA
Janani Pharmacy HANWELLA Mycotin 10 2021 4 NEGA

我想得到的是:

Cust_name Town Product Sales_qty Year Month Distributor_name
Janani Pharmacy HANWELLA Mycotin 0 2021 1 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 2 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 3 NEGA
Janani Pharmacy HANWELLA Mycotin 10 2021 4 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 5 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 6 NEGA
Janani Pharmacy HANWELLA Mycotin 10 2021 7 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 8 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 9 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 10 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 11 NEGA
Janani Pharmacy HANWELLA Mycotin 0 2021 12 NEGA

我也尝试过使用左连接,但它不起作用。

【问题讨论】:

  • 很常见的问题...谷歌日历表。

标签: sql sql-server tsql


【解决方案1】:

我猜 Sales 表没有保存没有销售的记录。这样的东西在“理论上”应该构建一个包含你需要的一切的表。

  1. TABLENEEDS 获取所有不同的年份、distcode、productcode、town_code 和 cust_code
  2. BUILDOUT 运行交叉连接,将所有月份应用于 TABLENEEDS 中的所有不同集(假设 dbo.SalesSummary.month_numb 包含所有 12 个月)
  3. ADDSALESBACK 正是这样做的,它是跨所有条件的左连接,将不存在销售额的空值变为零。

最终的选择只显示 ADDSALESBACK - 您只需从 ADDSALESBACK 表而不是 dbo.SalesSummary 进行其他联接

WITH TABLENEEDS AS (
SELECT DISTINCT
  dbo.SalesSummary.year_numb,
  dbo.SalesSummary.DistCode,
  dbo.SalesSummary.ProductCode,
  dbo.SalesSummary.town_code,
  dbo.SalesSummary.cust_code,
FROM dbo.SalesSummary
)

,

BUILDOUT AS(
SELECT *
FROM TABLENEEDS
CROSS JOIN (SELECT DISTINCT dbo.SalesSummary.month_numb FROM dbo.SalesSummary) AS MONTHSFORBUILDOUT
)

,

ADDSALESBACK AS(
SELECT
BUILDOUT.*,
COALESCE(dbo.SalesSummary.sales_qty, 0) AS sales_qty
FROM BUILDOUT
LEFT JOIN dbo.SalesSummary
ON dbo.SalesSummary.year_numb = BUILDOUT.year_numb AND dbo.SalesSummary.DistCode = BUILDOUT.DistCode AND dbo.SalesSummary.ProductCode, = BUILDOUT.ProductCode AND dbo.SalesSummary.town_code = BUILDOUT.town_code AND dbo.SalesSummary.cust_code = BUILDOUT.cust_code AND 
dbo.SalesSummer.month_numb = BUILDOUT.month_numb)

SELECT *
FROM ADDSALESBACK

【讨论】:

  • 您好,感谢您的回答,但是我似乎遇到了问题,我在 ')' 附近的语法不正确。在代码的 BUILDOUT 部分的最后,代码的 BUILDOUT 部分中的最后一个括号中期望为 for_path、id 或quoted_id。如果可以帮助澄清最受赞赏的原因是什么
  • 我猜由于 CROSS JOIN 使用子查询,它需要一个名称 - 我在帖子中添加了 AS MONTHSFORBUILDOUT 作为名称
  • 嗨,它有效,我得到了重复:如链接中所示snipboard.io/5rKsN9.jpg 应该只有第 4 个月和第 7 个月的销售数量,其他销售数量应该为空或零
  • 我在 month_numb 的 where 子句中缺少限定符 - 添加 AND dbo.SalesSummer.month_numb = BUILDOUT.month_numb - 我也编辑了我的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多