[英]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]这就是我想要的:[带有新列的示例数据]
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).您需要将当前年份的数据偏移到前一年,然后将其与当前数据合并,为“其他”度量(前一年的VOL
和REV
以及当年的VOL_PY
和REV_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.