首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在表中没有记录的情况下获得最后12个月的值

如何在表中没有记录的情况下获得最后12个月的值
EN

Database Administration用户
提问于 2018-11-05 19:46:40
回答 2查看 3K关注 0票数 0

我有一个表,其中PartNumberKey和Depot_ID作为复合主键。它返回以下数据-

要求添加最后12个月(即2018-11至2018-12年)中没有0作为总计的月份列。预期产出应是:

请帮我做一下查询?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-11-05 20:23:56

从一个数字表开始,然后与dateadd一起使用它来生成一个月表。然后你就可以left join了。

如果没有数字表,则可以在足够大的表上使用ROW_NUMBER

代码语言:javascript
复制
SELECT TOP (DATEDIFF(month, @month1, @month2)+1)
    DATEADD(month, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) -1, @month1) AS TheMonth
    FROM dbo.MyTable

您还需要PartNumberKey和Depot_ID值的列表。

代码语言:javascript
复制
DECLARE @month1 date = ‘20171201’, @month2 date = ‘20181101’; -- the semicolon is important!!
WITH months as (
    SELECT TOP (DATEDIFF(month, @month1, @month2)+1)
    DATEADD(month, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) -1, @month1) AS TheMonth
    FROM dbo.MyTable
),
PartsDepots as (
    SELECT DISTINCT PartNumberKey, Depot_ID
    FROM dbo.MyTable
)
SELECT pd.PartNumberKey, pd.Depot_ID, m.TheMonth, COUNT(*) AS Total
FROM months m
CROSS JOIN PartsDepots pd 
LEFT JOIN dbo.MyTable t
    ON t.TheDate >= m.TheMonth
    AND t.TheDate < DATEADD(month,1,m.TheMonth)
    AND t.PartNumberKey = pd.PartNumberKey
    AND t.Depot_ID = pd.Depot_ID
GROUP BY t.TheMonth, pd.PartNumberKey, pd.Depot_ID
;
票数 2
EN

Database Administration用户

发布于 2018-11-05 20:16:45

假设这张表:

代码语言:javascript
复制
CREATE TABLE #ProductData
(
  PartNumberKey char(5),
  Depot_ID char(2),
  [Month] char(7),
  Total int,
  CONSTRAINT PK_PD PRIMARY KEY (PartNumberKey, Depot_ID)
);

INSERT #ProductData VALUES('1538A','2B','2018-02',17),
                          ('1538B','2A','2017-12',23);

这是一个有趣的问题,因为您既需要确定缺少的月份,也需要为那些缺少的月份填写缺少的键/ID组合。

代码语言:javascript
复制
DECLARE @months    int  = 12, -- up to 100
        @thismonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()),1);

;WITH m AS
(
  SELECT m = 1 UNION ALL SELECT m + 1 FROM m WHERE m < @months
),
months(m) AS
(
  SELECT CONVERT(char(7), DATEADD(MONTH, 1-m, @thismonth))
  FROM m
),
keypairs AS
(
  SELECT PartNumberKey, Depot_ID
    FROM #ProductData
    WHERE [Month] >= CONVERT(char(7), DATEADD(MONTH, -11, @thismonth), 120)
    GROUP BY PartNumberKey, Depot_ID
)
SELECT m.m, p.PartNumberKey, p.Depot_ID, COALESCE(pd.Total,0)
  FROM months AS m
  CROSS JOIN keypairs AS p
  LEFT OUTER JOIN #ProductData AS pd
    ON p.PartNumberKey = pd.PartNumberKey
   AND p.Depot_ID = pd.Depot_ID
   AND m.m = pd.[Month]
ORDER BY p.PartNumberKey, p.Depot_ID, m.m;
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/221837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档