DB2 SQL-如何显示过去12周的计数,每个星期都是其自己的列

问题描述 投票:0回答:1

使用DB2 SQL,我需要提取过去12个整周的数据。 (此报告将每周运行一次,而我每周需要过去12个整周的时间来提取该报告)。我需要将周数设置为柱状格式,并每周计数一次。所以有两个问题:我不确定过去12周的表现如何。而且我不确定如何在自己的专栏中获得这些周的服务。

所需样本输出:

ACCOUNT  WEEK1_CT  WEEK2_CT  WEEK3_CT....   WEEK12_CT
 123       2          2         3              5
 789       6          3         6              6
 333       18         20        15             20

具有逻辑的示例查询,我试图用来拉回过去12个整周的时间。收到错误消息:“ WEEK”在使用上下文中无效。但是,不确定这是否是正确的路径。

SELECT 
C.ACCOUNT_NUM,
DATEPART(WEEK,D.LST_SENT_DT) AS WEEK,
COUNT(DISTINCT A.SPECIMEN_NUM) AS COUNT

FROM 
FACT    A, 
FIN_ORG B, 
ACCOUNT C, 
DATE    D

WHERE 
A.FINANCIAL_SRGT   = B.FINANCIAL_SRGT AND 
A.CLIENT_SRGT      = C.CLIENT_SRGT AND 
A.LST_SENT_DT_SRGT = D.LST_SENT_DT_SRGT AND 
B.DIVISION_NUM = 'W' AND 
datepart(week, D.LST_SENT_DT) between (date_trunc('week', current_date) 
-12) 
AND date_trunc('week', current_date)  
GROUP BY 
C.ACCOUNT_NUM, DATEPART(WEEK, D.LST_SENT_DT)

DATE表中的样本表数据:

LST_SENT_YR   LST_SENT_MTH_NUM   LST_SENT_WK  LST_SENT_DT
2019             1                 3           1/16/2019
2019             1                 4           1/24/2019
2019             4                 14          4/2/2019
2019             4                 14          4/6/2019   
sql db2 crosstab datepart
1个回答
0
投票
WITH 
  T (WEEK_NUM, WEEK_END_DT) AS 
(
VALUES (1, DATE('2020-01-02') - DAYOFWEEK_ISO(DATE('2020-01-02')))
  UNION ALL
SELECT WEEK_NUM + 1, WEEK_END_DT - 7
FROM T
WHERE WEEK_NUM < 12
)
, WEEKS AS
(
SELECT WEEK_NUM, WEEK_END_DT - 6 AS WEEK_START_DT, WEEK_END_DT
FROM T
)
, ACCOUNT_INFO (ACCOUNT, DT, CT) AS 
(
VALUES 
  (1, DATE('2019-12-25'), 5)
, (1, DATE('2019-12-26'), 10)
, (2, DATE('2019-12-01'), 20)
)
SELECT 
  D.ACCOUNT
, SUM(CASE W.WEEK_NUM WHEN  1 THEN A.CT ELSE 0 END) AS WEEK1_CT
, SUM(CASE W.WEEK_NUM WHEN  2 THEN A.CT ELSE 0 END) AS WEEK2_CT
, SUM(CASE W.WEEK_NUM WHEN  3 THEN A.CT ELSE 0 END) AS WEEK3_CT
, SUM(CASE W.WEEK_NUM WHEN  4 THEN A.CT ELSE 0 END) AS WEEK4_CT
, SUM(CASE W.WEEK_NUM WHEN  5 THEN A.CT ELSE 0 END) AS WEEK5_CT
, SUM(CASE W.WEEK_NUM WHEN  6 THEN A.CT ELSE 0 END) AS WEEK6_CT
, SUM(CASE W.WEEK_NUM WHEN  7 THEN A.CT ELSE 0 END) AS WEEK7_CT
, SUM(CASE W.WEEK_NUM WHEN  8 THEN A.CT ELSE 0 END) AS WEEK8_CT
, SUM(CASE W.WEEK_NUM WHEN  9 THEN A.CT ELSE 0 END) AS WEEK9_CT
, SUM(CASE W.WEEK_NUM WHEN 10 THEN A.CT ELSE 0 END) AS WEEK10_CT
, SUM(CASE W.WEEK_NUM WHEN 11 THEN A.CT ELSE 0 END) AS WEEK11_CT
, SUM(CASE W.WEEK_NUM WHEN 12 THEN A.CT ELSE 0 END) AS WEEK12_CT
FROM WEEKS AS W, (SELECT DISTINCT ACCOUNT FROM ACCOUNT_INFO) D
LEFT JOIN ACCOUNT_INFO A ON A.DT BETWEEN W.WEEK_START_DT AND W.WEEK_END_DT AND A.ACCOUNT = D.ACCOUNT
GROUP BY D.ACCOUNT;

|ACCOUNT    |WEEK1_CT   |WEEK2_CT   |WEEK3_CT   |WEEK4_CT   |WEEK5_CT   |WEEK6_CT   |WEEK7_CT   |WEEK8_CT   |WEEK9_CT   |WEEK10_CT  |WEEK11_CT  |WEEK12_CT  |
|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
|1          |15         |0          |0          |0          |0          |0          |0          |0          |0          |0          |0          |0          |
|2          |0          |0          |0          |0          |20         |0          |0          |0          |0          |0          |0          |0          |

您可以按原样运行此查询。我们根据任何给定的日期生成过去12周的表格WEEKS,格式为:Week_number, Monday_Date, Sunday_Date然后,我们将此表与帐户,日期和要汇总的列(CT)结合到表(ACCOUNT_INFO)中。最后,我们根据帐户对结果进行分组。

© www.soinside.com 2019 - 2024. All rights reserved.