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

“本月的中期价值”是多少。我看到一堆不同的值。每个月的每一天都会有一个不同的中间值。我需要把每一个都退回。