如何为作为季度结束日期的列名创建动态SQL?

如何为作为季度结束日期的列名创建动态SQL?,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我有三张这样的桌子 --TABLE1 --DROP TABLE POR CREATE TABLE POR ( IDRSSD varchar(10), Institution VARCHAR(100), Filing_Type int) INSERT INTO POR (IDRSSD, Institution, Filing_Type) VALUES ('53540', 'Wells', 3) INSERT INTO POR (IDRSSD, Institution, Fil

我有三张这样的桌子

--TABLE1
--DROP TABLE POR
CREATE TABLE POR
( IDRSSD varchar(10),
  Institution  VARCHAR(100),
  Filing_Type int)
INSERT INTO POR
  (IDRSSD, Institution, Filing_Type)
VALUES
  ('53540', 'Wells', 3)
INSERT INTO POR
  (IDRSSD, Institution, Filing_Type)
VALUES
  ('53550', 'BofA', 1)
INSERT INTO POR
  (IDRSSD, Institution, Filing_Type)
VALUES
  ('53560', 'Chase', 2)
INSERT INTO POR
  (IDRSSD, Institution, Filing_Type)
VALUES
  ('53570', 'JPM', 4)

--TABLE2
--DROP TABLE RCA
CREATE TABLE RCA
( IDRSSD varchar(10),
  Schedule_Code  VARCHAR(10),
  Line_Item varchar(100),
  Code varchar(10),
  [2019Q4] varchar(10),
  [2019Q3] varchar(10),
  [2019Q2] varchar(10),
  [2019Q1] varchar(10),
  [2018Q4] varchar(10),
  [2018Q3] varchar(10))

INSERT INTO RCA
  (IDRSSD, Schedule_Code, Line_Item, Code, [2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3])
VALUES
  ('53540', 'RC', 'Cash & Noninterest-bearing Deps', 'RCFD1881',  '127000', '146000', '9370', '1000', '1300', '12000')

INSERT INTO RCA
  (IDRSSD, Schedule_Code, Line_Item, Code, [2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3])
VALUES
  ('53540', 'RC', 'Cash & Noninterest-bearing Deps', 'RCFD1881',  '4390', '8220', '7570', '9800', '11230', '15570')

INSERT INTO RCA
  (IDRSSD, Schedule_Code, Line_Item, Code, [2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3])
VALUES
  ('53560', 'RC', 'Cash & Noninterest-bearing Deps', 'RCFD1881',  '14390', '8220', '700', '4800', '1230', '57')

INSERT INTO RCA
  (IDRSSD, Schedule_Code, Line_Item, Code, [2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3])
VALUES
  ('53560', 'RC', 'Cash & Noninterest-bearing Deps', 'RCFD1881',  '9000', '2200', '5700', '980', '300', '5570')

--TABLE3
--DROP TABLE Mapping
CREATE TABLE Mapping
( Schedule_Code varchar(10),
  Call_Report  VARCHAR(100))

INSERT INTO Mapping
(Schedule_Code, Call_Report)
VALUES
('RC', 'Balance Sheet')
INSERT INTO Mapping
(Schedule_Code, Call_Report)
VALUES
('RCA', 'Cash and Balances')
INSERT INTO Mapping
(Schedule_Code, Call_Report)
VALUES
('RCB', 'Securities')
现在,我可以很容易地加入这样的表格(专家们的儿童游戏)

结果:

select *
     from [RCA]
     unpivot
     (
        data
        for d in ('[IDRSSD],[Schedule_Code],[Code],[2019Q4],[2019Q3],[2019Q2],[2019Q1],[2018Q4],[2018Q3]')
     ) u
[![在此处输入图像描述][1][1]

我想做的是尝试动态调整季度结束日期,因为季度会不时变化(有时我们会有更多的季度,有时我们会有更少的季度)。所以,如果可能的话,我希望最终结果是这样的

[![[2]][2]

这是可能的,还是太难了

我试过了,得到了一个小的枢轴,但它没有连接到其他两个表,也没有求和。而且,很明显,我的列名根本不是动态的

SELECT [IDRSSD], Qtr, Amt
FROM   
   (SELECT [IDRSSD], [2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3] 
   FROM RCA
   ) p  
UNPIVOT  
   (Amt FOR Qtr IN   
      ([2019Q4], [2019Q3], [2019Q2], [2019Q1], [2018Q4], [2018Q3])  
)AS unpvt 
[![在此处输入图像描述][3][3]

我也试过了,但没有取得很大的进展

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.[RCA]') 
           for xml path('')), 1, 1, '')
--print(@colsUnpivot)

set @query 
  = 'select *
     from [RCA]
     unpivot
     (
        data
        for d in ('''+ @colsunpivot +''')
     ) u'
print(@query)
结果:

select *
     from [RCA]
     unpivot
     (
        data
        for d in ('[IDRSSD],[Schedule_Code],[Code],[2019Q4],[2019Q3],[2019Q2],[2019Q1],[2018Q4],[2018Q3]')
     ) u

您可以使用交叉应用和应用聚合实现数据,如下所示:

选择RCA。[idrsd],
POR.机构,
文件归档类型,
RCA.附表_代码,
Map.Call_报告,
RCA.Line_项目,
RCA代码,
右图(RCA代码,4)为协调代码,
Q.四分之一,金额(铸造(Q.金额为整数))为金额
从[RCA]作为RCA
内部联接[POR]作为POR
在RCA.idrsd=POR.idrsd上
作为映射的内部连接映射
关于RCA.Schedule\u代码=Map.Schedule\u代码
交叉应用
(
价值观
('2019Q4',RCA[2019Q4]),
('2019Q3',RCA[2019Q3]),
('2019Q2',RCA[2019Q2]),
('2019Q1',RCA[2019Q1]),
('2018Q4',RCA[2018Q4]),
('2018Q3',RCA[2018Q3])
)作为Q(四分之一,金额)
按区域协调机构分组。[IDRSD],区域机构,区域归档类型,区域协调机构计划代码,呼叫报告,行项目,代码,季度末

你有没有想过重做设计,以便将其存储在表中,而不进行初始化(即标准化)?我认为这几乎可以实现!我刚刚用我的发现更新了我的原始帖子。这很有效,我犯了一个错误。你的代码行得通。非常感谢你!!还有一个简单的问题,我能用这个十字架使日期动态吗?比如:FROMDATE,TODATE…四分之一结束于日期时间(floor(cast(FROMDATE作为float))和日期时间(floor(cast(TODATE作为float))之间@ASH,是的。通过交叉应用,您可以拥有动态的做事方式。您可以在交叉应用子句中使用WHERE子句。您可以从外部查询传递值,并将其添加到交叉应用子句中的WHERE子句。我该如何做?我尝试了以下方法:将值('2019Q4',RCA.[2019Q4]),('2019Q3',RCA.[2019Q3]),('2019Q2',RCA.[2019Q2]),('2019Q1',RCA.[2019Q1]),('2018Q3',RCA.[2018Q3])('2018Q2',RCA.[2018Q2作为Q(四分之一,金额),其中Q.QuarterEnd>='2016Q1但当日期不在表格标题中时,我得到一个错误。我希望让它有点动感,所以如果有日期,抓住它,如果没有,跳过它。可能吗?