Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlserver-使用pivot将多行合并为一行_Sql_Sql Server_Pivot - Fatal编程技术网

sqlserver-使用pivot将多行合并为一行

sqlserver-使用pivot将多行合并为一行,sql,sql-server,pivot,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 为了将多行合并为一行,我可以执行以下

假设我们有下表:

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
更新:

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

  • 原始表格中给出了总金额和平均金额。我不需要做计算

  • 以下是您可以使用表格的链接:

    您需要在
    旋转之前
    取消PIVOT
    数据

    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 
    

    注意:如果
    类型的数量未知,则需要使用
    动态sql

    以下是另一种方法。这是使用交叉表查询而不是透视。我发现语法没有那么迟钝,甚至比使用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
    

    类型的数量是固定的吗?你需要求平均数的平均值还是求和?第一个表显示了总金额,而第一个表只显示了金额,您将其相加。对于第二个查询,您是在处理已聚合的结果还是没有?@TomH请查看更新我单独运行第一个select语句,然后首先查看结果。现在,我想我理解了你在这里所说的“先解压”数据,然后再进行数据透视的意思。