【问题标题】:T-SQL Query change multiple Columns to Single Column Grouped by DateT-SQL 查询将多列更改为按日期分组的单列
【发布时间】:2019-12-31 11:33:15
【问题描述】:

我正在尝试将 RAW 数据的表结构从宽表更改为窄表。

所以我设法使它适用于一组列。当我尝试制作更多列时,问题就开始了。

我试过只使用 UNPIVOT,但这似乎不起作用。

所以我为每组数据有 10 列(每列代表该值的一年),我想把它变成一列。

例如从 [YREnd1]、[YREnd2]、[YREnd3] 等到 [YREnd]。但是,当我尝试添加时,我已经为一组进行了管理。 [有形] 它只是重复第一年的值,而不是使用下一个值。

我怀疑我只是错过了一个连接,以匹配有形的年末和上半年的年末,但我不知道该怎么做。

这行得通

SELECT [PandL1].[RegNum],
       c.[YrEnd]
  FROM [Raw_UK].[dbo].[PandL1]
  JOIN [Raw_UK].[dbo].[PandL2] on [PandL1].[RegNum]=[PandL2].[RegNum]
  JOIN [Raw_UK].[dbo].Balance1 on Balance1.[RegNum] = [PandL1].[RegNum]
  JOIN [Raw_UK].[dbo].Balance2 on Balance2.[RegNum] = [PandL1].[RegNum]
  JOIN [Raw_UK].[dbo].Balance3 on Balance3.[RegNum] = [PandL1].[RegNum]
Cross apply
(
    Values
    ('[Accounts date Last avail  yr]', [Accounts date Last avail  yr]),
    ('[Accounts date Year - 1]', [Accounts date Year - 1]),
    ('[Accounts date Year - 2]', [Accounts date Year - 2]),
    ('[Accounts date Year - 3]', [Accounts date Year - 3]),
    ('[Accounts date Year - 4]', [Accounts date Year - 4]),
    ('[Accounts date Year - 5]', [Accounts date Year - 5]),
    ('[Accounts date Year - 6]', [Accounts date Year - 6]),
    ('[Accounts date Year - 7]', [Accounts date Year - 7]),
    ('[Accounts date Year - 8]', [Accounts date Year - 8]),
        ('[Accounts date Year - 9]', [Accounts date Year - 9])
    ) c ([RegNum],[YrEnd])
    GROUP BY [PandL1].[RegNum],
           c.[YrEnd];

这不起作用:

    SELECT [PandL1].[RegNum],
           c.[YrEnd],
           t.[Tangibles]
      FROM [Raw_UK].[dbo].[PandL1]
      JOIN [Raw_UK].[dbo].[PandL2] on [PandL1].[RegNum] = [PandL2]               
.[RegNum]
JOIN [Raw_UK].[dbo].Balance1 on Balance1.[RegNum] = [PandL1].[RegNum]
  JOIN [Raw_UK].[dbo].Balance2 on Balance2.[RegNum] = [PandL1].[RegNum]
  JOIN [Raw_UK].[dbo].Balance3 on Balance3.[RegNum] = [PandL1].[RegNum]
Cross apply
(
    Values
    ('[Accounts date Last avail  yr]', [Accounts date Last avail  yr]),
    ('[Accounts date Year - 1]', [Accounts date Year - 1]),
    ('[Accounts date Year - 2]', [Accounts date Year - 2]),
    ('[Accounts date Year - 3]', [Accounts date Year - 3]),
    ('[Accounts date Year - 4]', [Accounts date Year - 4]),
    ('[Accounts date Year - 5]', [Accounts date Year - 5]),
    ('[Accounts date Year - 6]', [Accounts date Year - 6]),
    ('[Accounts date Year - 7]', [Accounts date Year - 7]),
    ('[Accounts date Year - 8]', [Accounts date Year - 8]),
    ('[Accounts date Year - 9]', [Accounts date Year - 9])
) c ([RegNum],[YrEnd])
Cross apply
(
    Values
    ('[Tangible Assets th GBP Last avail  yr]', [Tangible Assets th GBP    
Last avail  yr]),
    ('[Tangible Assets th GBP Year - 1]',[Tangible Assets th GBP Year - 1]),
    ('[Tangible Assets th GBP Year - 2]',[Tangible Assets th GBP Year - 2]),
    ('[Tangible Assets th GBP Year - 3]',[Tangible Assets th GBP Year - 3]),
    ('[Tangible Assets th GBP Year - 4]',[Tangible Assets th GBP Year - 4]),
    ('[Tangible Assets th GBP Year - 5]',[Tangible Assets th GBP Year - 5]),
    ('[Tangible Assets th GBP Year - 6]',[Tangible Assets th GBP Year - 6]),
    ('[Tangible Assets th GBP Year - 7]',[Tangible Assets th GBP Year - 7]),
    ('[Tangible Assets th GBP Year - 8]',[Tangible Assets th GBP Year - 8]),
    ('[Tangible Assets th GBP Year - 9]',[Tangible Assets th GBP Year - 9])
)
t ([RegNum], [Tangibles])
GROUP BY [PandL1].[RegNum],
       c.[YrEnd],
       t.[Tangibles];

结果应该是:

GB********, 31/12/2018, 3575
GB********, 31/12/2017, 3187
GB********, 31/12/2016, 3084
GB********, 31/12/2015, 2813
GB********, 31/12/2014, 2758
GB********, 31/12/2013, 2621
GB********, 31/12/2012, 2304
GB********, 31/12/2011, 2298
GB********, 31/12/2010, 2045
GB********, 31/12/2009, 1967

我得到的是:

GB********, 31/12/2018, 3575
GB********, 31/12/2017, 3575
GB********, 31/12/2016, 3575
GB********, 31/12/2015, 3575
GB********, 31/12/2014, 3575
GB********, 31/12/2013, 3575
GB********, 31/12/2012, 3575
GB********, 31/12/2011, 3575
GB********, 31/12/2010, 3575
GB********, 31/12/2009, 3575

【问题讨论】:

    标签: sql-server tsql unpivot


    【解决方案1】:

    您好,在对此进行更多研究后,我得到了答案,感谢此链接:Using PIVOT to Flip Data from Wide to Tall

    我需要做的是:

    Cross apply 
    (VALUES
    ([Accounts date Last avail  yr], [Tangible Assets th GBP Last avail  yr]),
    ([Accounts date Year - 1], [Tangible Assets th GBP Year - 1]),
    ([Accounts date Year - 2], [Tangible Assets th GBP Year - 2]),
    ([Accounts date Year - 3], [Tangible Assets th GBP Year - 3]),
    ([Accounts date Year - 4], [Tangible Assets th GBP Year - 4]),
    ([Accounts date Year - 5], [Tangible Assets th GBP Year - 5]),
    ([Accounts date Year - 6], [Tangible Assets th GBP Year - 6]),
    ([Accounts date Year - 7], [Tangible Assets th GBP Year - 7]),
    ([Accounts date Year - 8], [Tangible Assets th GBP Year - 8]),
    ([Accounts date Year - 9], [Tangible Assets th GBP Year - 9])
    ) x ([YrEnd], [Tangibles])
    

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多