繁体   English   中英

SQL-YTD中的MTD编号,缺少编号

[英]SQL - MTD numbers from YTD, missing numbers

以下是我的查询。 简而言之,我的数据是年初至今的数字,因此该查询通过获取当前月份和减去month-1来计算月份至今的移动。

如果当前月份包含上个月的所有组合,则效果很好。 但是这个月的连击之一为零-因此YTD = 0,9月份没有记录。

但是记录仍然存在于8月,因此应该给我一个动静,即8月显示100,9月什么也不显示。 因此运动应为0-100 = -100。

我不知道如何调整查询,我必须说明我首先需要哪个月份,其中curr.month = 9,但是由于该组合在9月份不存在,因此我的联接不能很好地工作。 请帮忙。 它使用Sep数据作为基础,应该同时使用Aug和Sep组合。

 SELECT curr.[Month], 
     curr.[GRCARef], 
     curr.[IEItem],
     curr.currYTD, 
     prev.prevYTD, 
   CASE curr.[Month]
   When 1 then currYTD
   ELSE
   cast((currYTD - COALESCE(prevYTD,0)) as numeric(15,2))
   END as MTD

FROM   

   (SELECT [Month], 
           [GRCARef],
           [Ac Code] IEItem,
           sum([BalLCY]) currYTD
   FROM    [PWC_2017Q2].[dbo].[SS620_PL_FullYear]
   Group by  [Month], [Bch], [GRCARef],[Ac Code], [ProdType],[GHO]
   )  curr

   Full Outer JOIN 

   (SELECT [Month], 
           [GRCARef],
           [Ac Code] IEItem, 
           sum([BalLCY]) prevYTD
    FROM   [PWC_2017Q2].[dbo].[SS620_PL_FullYear]
    Group by  [Month], [Bch], [GRCARef], [Ac Code], [ProdType],[GHO]
    )   prev

    ON  curr.[GRCARef] = prev.[GRCARef]
    and curr.[IEItem] = prev.[IEItem]
    and curr.[Month] - 1 = prev.[Month] 
       -- Join with Month -1

where 
curr.[MONTH] = 9

尝试这个。

cast((ISNULL(currYTD,0) - COALESCE(prevYTD,0)) as numeric(15,2))

您需要强制存在几个月,然后加入摘要:

;with
m as (
    -- get numbers from 1 to 12
    select top 12 ROW_NUMBER() over (order by id) [Month]
    from sysobjects
),
g as (
   SELECT [Month], [GRCARef], [Ac Code] IEItem, sum([BalLCY]) YTD
   FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear]
   Group by [Month], [Bch], [GRCARef], [Ac Code], [ProdType], [GHO]
)
select 
    m.[Month], 
    ISNULL(curr.GRCARef, prev.GRCARef) GRCARef, 
    ISNULL(curr.IEItem, prev.IEItem) IEItem, 
    ISNULL(curr.YTD, 0) currYTD, ISNULL(prev.YTD, 0) prevYTD, 
    ISNULL(curr.YTD, 0) - ISNULL(prev.YTD, 0) MTD
from m
left join g curr on m.[Month] = curr.[Month]
left join g prev on m.[Month] = prev.[Month] + 1
where 
    m.[Month] = 9

注意,您的组中没有[Bch], [ProdType], [GHO] 。如果它们“不相关”,则将其删除,如果它们相关,则应将它们放在select子句中,并且在加入条件下

编辑:如果您使用SQL Server 2012及更高版本,则还可以使用LAG函数来获取上个月的摘要:

;with
m as (
    -- get numbers from 1 to 12
    select top 12 ROW_NUMBER() over (order by id) [Month]
    from sysobjects
),
g as (
   SELECT [Month], [GRCARef], [Ac Code] IEItem, sum([BalLCY]) YTD
   FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear]
   Group by [Month], [Bch], [GRCARef], [Ac Code], [ProdType], [GHO]
)
f as (
select 
    m.[Month], GRCARef, IEItem, ISNULL(YTD, 0) currYTD, ISNULL(LAG(YTD, 1, 0) over (order by m.[Month]), 0) as prevYTD
from m
left join g curr on m.[Month] = curr.[Month]
)
select *, currYTD-prevYTD MTD
from f
where 
    [Month] = 9
order by [Month]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM