【问题标题】:SQL query to Transpose columns into rows将列转置为行的 SQL 查询
【发布时间】:2014-12-23 05:15:11
【问题描述】:

有人可以帮助查询以下问题

返回表

Id     Factor  monthlyReturns  price date

A1     0.2     0.001           2010-01-29
A1     0.2     0.003           2010-02-26
A1     0.2     0.004           2010-03-31
A1     0.2     0.004           2010-04-30
A2     0.1     0.001           2010-01-29
A2     0.1     0.001           2010-02-26
A2     0.1     0.001           2010-03-31
A2     0.1     0.001           2010-04-30 
A3     0.3     0.03            2010-01-29 
A3     0.3     0.04            2010-02-26
A3     0.3     0.05            2010-03-31
A3     0.3     0.05            2010-04-30
A4     0.4     0.12            2010-01-29
A4     0.4     0.12            2010-02-26
A4     0.4     0.14            2010-03-31
A4     0.4     0.15            2010-04-30

我想将此数据转换为以下格式。有人可以提出查询

            A1       A2      A3      A4      Total
31-Jan-10   0.001   0.001   0.03    0.12     0.001*0.2(Factor for  A1)+0.001*0.1(Factor forA2)+
                                             0.03*0.3(Factor forA3)+ 0.12*0.4(Factor forA4)

28-Feb-10   0.003   0.001   0.04    0.12     Same as above
31-Mar-10   0.004   0.001   0.05    0.14     Same as above
30-Apr-10   0.004   0.001   0.05    0.15     Same as above

谢谢

【问题讨论】:

  • PIVOT 是您要查找的关键字。但是你必须知道这些值,否则你将不得不使用动态 SQL。堆栈中已经存在几个示例:stackoverflow.com/questions/16417484/tsql-complex-pivot 一个。
  • 输入数据中没有 31-Jan-10。输出数据中怎么会产生这样的日期?
  • @Giorgos - 这是表中的原始数据,但在报告中显示的是月末日期。所以可以忽略。

标签: tsql pivot


【解决方案1】:

以下是您要求的查询,请注意您需要将表名更改为您的。

一点解释: 我假设 ID 仅限于 A1、A2、A3、A4。否则这将不起作用,您将需要更复杂的解决方案。

首先我创建了一个数据透视表的公用表表达式,其中所有因素按日期分组(假设在同一日期不能有两个因素指向同一个 id)

然后,我将它与一个包含所有月度回报的透视表连接起来。

注意:我在字段 A1、A2、.. 上使用了 sum 函数,因为我需要按日期对其进行分组,并且如果该列不在 group by 子句中,则选择只能使用聚合函数。 这不会影响值,因为您在特定日期的每个 id 只有一行,但如果我错了,请纠正我。

with FactorsByDate(PriceDate,FactorA1,FactorA2,FactorA3,FactorA4)
AS
(
  SELECT [price date] AS Date, 
  SUM([A1]) AS A1, SUM([A2]) AS A2, SUM([A3]) AS A3, SUM([A4]) AS A4
  FROM
  (SELECT Id, Factor , [price date]
   FROM TempTbl) AS SourceTable
   PIVOT
   (
     SUM(Factor)
     FOR Id IN ([A1], [A2], [A3], [A4])
   ) AS PivotTable
   group by [price date]
)
SELECT Date,A1,A2,A3,A4, A1*FactorA1 + A2*FactorA2 + A3*FactorA3 + A4*FactorA4 AS Total
FROM
(
  SELECT [price date] AS Date, 
  SUM([A1]) AS A1, SUM([A2]) AS A2, SUM([A3]) AS A3, SUM([A4]) AS A4
  FROM
  (SELECT Id, monthlyReturns , [price date]
   FROM TempTbl) AS SourceTable
   PIVOT
   (
     SUM(monthlyReturns)
     FOR Id IN ([A1], [A2], [A3], [A4])
   ) AS PivotTable
   group by [price date]
  ) AS monthlyReturns
INNER JOIN FactorsByDate ON FactorsByDate.PriceDate = monthlyReturns.Date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多