簡體   English   中英

SQL:如何使用日期將數據從季度拆分為月度

[英]SQL: How to split data from quaterly to monthly with date

我在 sql 表中有季度格式的數據。 我需要能夠將其拆分為每月平均分配值([value/3)到每個月。 您能否幫助您了解如何使用 SQL 來實現這一目標? 謝謝你。

開始 結尾 價值
2022-01-01 2022-04-01 25629
2022-04-01 2022-07-01 993621


CREATE TABLE #your_tbl
    ("start_dt" timestamp, "end_dt" timestamp, "values" int)
;
    
INSERT INTO #your_tbl
    ("start_dt", "end_dt", "values")
VALUES
    ('2020-01-01 00:00:00', '2020-04-01 00:00:00', 114625),
    ('2020-04-01 00:00:00', '2020-07-01 00:00:00', 45216),
    ('2020-07-01 00:00:00', '2020-10-01 00:00:00', 513574)
    

DECLARE @datefrom datetime
DECLARE @dateto datetime
SET @datefrom='2022-04-01'
SET @dateto = '2022-07-01'

;WITH cte AS
(
SELECT @datefrom as MyDate
UNION ALL
SELECT DATEADD(month,1,MyDate)
FROM cte
WHERE DATEADD(month,1,MyDate)<@dateto
),

combined AS (
  SELECT *
  FROM #your_tbl q
  JOIN cte m
  ON YEAR(m.MyDate) >= q.start_dt
  AND MONTH(m.MyDate) < q.end_dt
  )
  SELECT *, [values]/COUNT(1) OVER(PARTITION BY [start_dt], [end_dt]) as monthly_values
  FROM combined

DROP TABLE #your_tbl

在 Oracle 中,您可以使用此腳本:

with mytable  as (
                  select to_date('2022-01-01', 'YYYY-MM-DD') as startX, to_date('2022-04-01', 'YYYY-MM-DD') as endX, 25629  as valueX from dual union
                  select to_date('2022-04-01', 'YYYY-MM-DD') as startX, to_date('2022-07-01', 'YYYY-MM-DD') as endX, 993621 as valueX from dual union
                  select to_date('2022-07-01', 'YYYY-MM-DD') as startX, to_date('2022-10-01', 'YYYY-MM-DD') as endX,     21 as valueX from dual union
                  select to_date('2022-10-01', 'YYYY-MM-DD') as startX, to_date('2023-01-01', 'YYYY-MM-DD') as endX,   7777 as valueX from dual 
                 ),
     mymonths as (
                  select '01' as month_n from dual union
                  select '02' as month_n from dual union
                  select '03' as month_n from dual union
                  select '04' as month_n from dual union
                  select '05' as month_n from dual union
                  select '06' as month_n from dual union
                  select '07' as month_n from dual union
                  select '08' as month_n from dual union
                  select '09' as month_n from dual union
                  select '10' as month_n from dual union
                  select '11' as month_n from dual union
                  select '12' as month_n from dual
                )
     select month_n, startX, valueX/3
       from mytable, mymonths
      where month_n between to_char(startX, 'MM') and to_char(endX-1, 'MM'); 

MONTHS_N STARTX       VALUEX/3
-------- ---------- ----------
01       01/01/2022       8543
02       01/01/2022       8543
03       01/01/2022       8543
04       01/04/2022     331207
05       01/04/2022     331207
06       01/04/2022     331207
07       01/07/2022          7
08       01/07/2022          7
09       01/07/2022          7
10       01/10/2022 2592,33333
11       01/10/2022 2592,33333
12       01/10/2022 2592,33333

謝謝你。

假設您可以弄清楚如何生成依賴於 RDBMS 的每月日期,這里有一個解決方案,可能取決於您是否可以使用窗口函數。

請注意,如果您處於部分季度,這不會硬編碼除以 3。

WITH combined AS (
  SELECT *,
  FROM your_tbl q
  JOIN monthly_dates m
  ON m.monthly_dt >= q.start_dt
  AND m.monthly_dt < q.end_dt
  )
  SELECT *
  , values / COUNT(1) OVER(PARTITION BY start_dt, end_dt) as monthly_values
  FROM combined

sqlfiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM