简体   繁体   English

如何在动态日期上显示上一年

[英]How to Show Previous Year on Dynamic Date

I have a database that has customer, product, date and volume/revenue data.我有一个包含客户、产品、日期和数量/收入数据的数据库。 I'd like to create two NEW columns to show the previous year volume and revenue based on the date/customer/product.我想创建两个新列,以根据日期/客户/产品显示上一年的销量和收入。

I've tried unioning two views, one that has dates (unchanged) and a second view that creates a CTE where I select the dates minus one year with another select statement off of that where VOL and REV are renamed VOL_PY and REV_PY but the data is incomplete.我尝试合并两个视图,一个具有日期(未更改),第二个视图创建一个 CTE,其中我 select 日期减去一年,另一个 select 语句关闭,其中 VOL 和 REV 被重命名为 VOL_PY 和 REV_PY 但数据不完整。 Basically what's happening is the PY data is only pulling volume and revenue if there is data in the prior year (for example if a customer didn't sell a product in 2021 but DID in 2020, it wouldn't pull for the VOL_PY for 2020 - because it didn't sell in 2021).基本上发生的情况是,如果上一年有数据,PY 数据只会拉动销量和收入(例如,如果客户在 2021 年没有销售产品但在 2020 年 DID,则不会拉动 2020 年的 VOL_PY - 因为它在 2021 年没有出售)。 How do I get my code to include matches in dates but also the instances where there isn't data in the "current" year?如何让我的代码包含日期中的匹配项以及“当前”年份中没有数据的实例?

Here's what I'm going for: [EXAMPLE DATA WITH NEW COLUMNS]这就是我想要的:[带有新列的示例数据]

1

CURRENT YEAR VIEW:当前年度视图:

   SELECT
   CUSTOMER
  ,PRODUCT
  ,DATE
  ,VOL
  ,REV
  ,0 AS VOL_HL_PY
  ,0 AS REV_DOLS_PY
  ,DATEADD(YEAR, -1, DATE) AS DATE_PY FROM dbo.vwReporting

PREVIOUS YEAR VIEW:上一年的看法:

WITH CTE_PYFIGURES 
     ([AUTONUMBER]
      ,CUSTOMER
      ,PRODUCT
      ,DATE
      ,VOL
      ,REV
      ,DATE_PY
      ) AS 

(
SELECT b.*
     , DATEADD(YEAR, 1, DATE) AS DATE_PY
FROM dbo.basetable b
)

SELECT  
       v.CUSTOMER
      ,v.PRODUCT
      ,v.DATE
      ,0 AS v.VOL
      ,0 AS v.REV
      ,CTE.VOL_HL AS VOL_HL_PY
      ,CTE.REV_DOLS AS REV_DOLS_PY
      ,DATEADD(YEAR,-1,CTE.PERIOD_DATE_PY) AS PERIOD_DATE_PY
FROM dbo.vwReporting AS v
FULL OUTER JOIN CTE_PYFIGURES AS CTE ON CTE.CUSTOMER=V.CUSTOMER AND CTE.PRODUCT=V.PRODCUT AND CTE.DATE_PY=V.DATE 

You need to offset your current year's data to one year forward and then union it with the current data, placing zeroes for "other" measures ( VOL and REV for previous year and VOL_PY and REV_PY for current year).您需要将当前年份的数据偏移到前一年,然后将其与当前数据合并,为“其他”度量(前一年的VOLREV以及当年的VOL_PYREV_PY )放置零。 Then do aggregation.然后进行聚合。 This way you'll have all the dimensions' values that were in current or previous year.这样,您将拥有当前或上一年的所有维度值。

with a as (
  select
    CUSTOMER
    , PRODUCT
    , [DATE]
    , VOL
    , REV
    , 0 as vol_py
    , 0 as rev_py
  from dbo.vwReporting

  union all

  select
    CUSTOMER
    , PRODUCT
    , dateadd(year, 1, [DATE]) as [DATE]
    , 0 as VOL
    , 0 as REV
    , vol as vol_py
    , rev as rev_py
  from dbo.vwReporting
)
select
    CUSTOMER
    , PRODUCT
    , [DATE]
    , VOL
    , sum(vol) as vol
    , sum(rev) as rev
    , sum(vol_py) as vol_py
    , sum(rev_py) as rev_py
from a
group by
    CUSTOMER
    , PRODUCT
    , [DATE]
    , VOL

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

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