sqlserver - 使用pivot将多行组合成一行

时间:2016-01-05 17:43:41

标签: sql sql-server pivot

假设我们有下表:

ID      Type    Amount
0001     A       10
0001     B       20
0001     C       30
0002     A       15
0002     C       20
0003     B       40
...

期望的结果将是:

ID      Type A   Type B    Type C 
0001     10       20        30

我可以执行以下操作,以便将多行合并为一行。

SELECT ID, A, B, C
FROM  MyTable 
PIVOT
(
      SUM(amount)
       FOR Type IN (A, B, C)
) AS P

然而,我的表比前一个表更复杂。 假设我的表格如下:

ID      Type    Total_Amount   Average_Amount
0001     A       10                0.5
0001     B       20                0.7
0001     C       30                0.9

所以我的问题是如何产生以下结果?

ID      TypeA_total  TypeB_total   TypeC_total TypeA_avg  TypeB_avg   TypeC_avg 
0001     10           20              30        0.5         0.7          0.9

更新

  1. 类型数量是固定的。这意味着只有A,B和C型。 有些ID可能只有一种类型。有些可能有3种类型。其他一些可能有两种类型。

  2. Total_amount和Average_amount在原始表中给出。我不需要做计算。

  3. 以下是您可以使用该表格的链接: http://sqlfiddle.com/#!3/4e6835

2 个答案:

答案 0 :(得分:1)

您需要在 <div class="tab-content"> <div id="mastery1" class="tab-pane fade"> <h1>Show the last 10 Games</h1> <div> <!-- more tab content --> </div>

之前unpivot数据
pivoting

注意:如果没有。 WITH cte AS (SELECT id, value, col_name FROM yourtable CROSS apply( VALUES (total_amount,'Type' + type + '_Total'), (average_amount,'Type' + type + '_Avg') ) CS (value, col_name)) SELECT * FROM cte PIVOT (Max(value) FOR col_name IN([TypeA_total],[TypeB_total],[TypeC_total], [TypeA_avg],[TypeB_avg],[TypeC_avg]))pv 未知,那么您需要使用types

答案 1 :(得分:1)

这是另一种方法。这是使用交叉表查询而不是PIVOT。我发现语法不那么钝,甚至比使用PIVOT还略有性能提升。

if OBJECT_ID('tempdb..#something') is not null
    drop table #something

create table #something
(
    ID char(4)
    , SomeType char(1)
    , Amount int
    , AverageAmount decimal(9, 2)
)

insert #something
select '0001', 'A', 10, .5 union all
select '0001', 'B', 20, .7 union all
select '0001', 'C', 30, .9;

with OrderedResults as
(
    select *
        , ROW_NUMBER() over(partition by ID order by SomeType) as RowNum
    from #something
)

select ID
    , MAX(Case when RowNum = 1 then SomeType end) as TypeA
    , MAX(Case when RowNum = 1 then AverageAmount end) as AverageA
    , MAX(Case when RowNum = 2 then SomeType end) as TypeB
    , MAX(Case when RowNum = 2 then AverageAmount end) as AverageB
    , MAX(Case when RowNum = 3 then SomeType end) as TypeC
    , MAX(Case when RowNum = 3 then AverageAmount end) as AverageC
from OrderedResults
group by ID