Sql 根据月初行的值动态选择列
以下查询:Sql 根据月初行的值动态选择列,sql,Sql,以下查询: SELECT Confirmed, Interim, Declared, Date FROM Interest_Hist WHERE Date BETWEEN '2019-08-01' AND '2019-12-04' ORDER BY Date ASC 返回以下示例数据: Confirmed Interim Declared Date Y 0.314
SELECT Confirmed, Interim, Declared, Date
FROM Interest_Hist
WHERE Date BETWEEN '2019-08-01' AND '2019-12-04'
ORDER BY Date ASC
返回以下示例数据:
Confirmed Interim Declared Date
Y 0.314 0.0788 2019-08-01
0.317 0 2019-08-02
...
0.245 0 2019-08-31
0.222 0.219 2019-09-01
0.198 0 2019-09-02
...
Y 0.50 0.454 2019-12-01
0.51 0 2019-12-02
0.52 0 2019-12-03
0.53 0 2019-12-04
其中,在月的第一天,确认
=Y,我需要返回该月的声明
列
注意,Confirmed=Y
仅在当月第一天存在。该列在所有其他情况下均为空
否则,我需要返回该月的每个临时列
到目前为止,我已经能够返回任一列的SUM
,但不能返回单个值
SELECT
CASE WHEN SUM(CASE WHEN IRc_Confirmed = 'Y' THEN 1 ELSE 0 END) = 0
THEN Interim
ELSE Declared
END AS Rate
FROM Fund_Interest
WHERE Date BETWEEN '2019-08-01' AND '2019-12-04'
GROUP BY
DATEADD(month, DATEDIFF(month, 0, Date), 0), Interim, Declared
ORDER BY
DATEADD(month, DATEDIFF(month, 0, Date), 0)
顶部数据的预期输出如下所示
0.0788
0
...
0
0.222
0.198
...
0.454
0
0
0
查找第一天为Y的所有年度月份:
SELECT year([date]) as yr, month([date]) as mo
FROM fund_interest
WHERE DAY([date]) = 1 and confirmed = 'Y'
这将为您提供一份2019年8月第一天出现Y的年份和月份列表
现在,将其设置为cte,并将其保留在年和月的数据中,在加入成功的位置返回:
WITH x AS(
SELECT year([date]) as yr, month([date]) as mo
FROM fund_interest
WHERE DAY([date]) = 1 and confirmed = 'Y'
)
SELECT
CASE WHEN x.yr IS NOT NULL THEN f.declared ELSE f.interim END AS something
FROM
fund_interest f
LEFT OUTER JOIN x ON x.yr = year(f.[date]) AND x.mo = month(f.[date])
从2019年8月到2019年12月的不同日期的所有行都将成功加入。它们将有一个非空的yr值,因此将显示声明的yr值。对于所有Sep 2019行,联接中没有匹配项(CTE中的查询不会返回Sep 2019),yr为null,而是临时显示
为了更好地了解正在发生的事情,请选择*
如果只想使用一列,可以使用EOMOUNT函数每月返回一个一致的日期。将月份替换为EOMOUNT。从查询中删除对YEAR的调用
不要使用保留字(如日期)作为列名,顺便说一下,您可以使用CTE按月份和年份分组,然后在日期字段的月份和年份部分加入原始表(利息历史)。然后,可以使用简单的case语句选择临时值或声明值
;WITH CTE AS
(
SELECT DATEPART(month, DateFld) Mnth, DATEPART(year, DateFld) Yr,
MAX(Confirmed) ConfirmedVal
FROM Interest_Hist
GROUP BY DATEPART(month, DateFld), DATEPART(year, DateFld)
)
SELECT
CASE WHEN c.ConfirmedVal= 'Y' THEN interest.Declared ELSE interest.Interim END
FROM Interest_Hist interest
INNER JOIN CTE c ON
DATEPART(month, interest.DateFld) = c.Mnth AND
DATEPART(year, interest.DateFld) = c.Yr
您可以看到查询正在运行这花费了我比它可能需要的时间更长的时间
SELECT IIF( MAX(Confirmed) OVER(PARTITION BY CONVERT(VARCHAR(6), Date, 112)) = 'Y', Declared, Interim) Interest_Rate
FROM Interest_Hist
WHERE DateBETWEEN '01-AUG-2019' AND '04-DEC-2019'
ORDER BY Date
“本月的中期价值”是多少。我看到一堆不同的值。每个月的每一天都会有一个不同的中间值。我需要把每一个都退回。