【问题标题】:Convert rows to columns with pivoting使用透视将行转换为列
【发布时间】:2017-03-25 01:22:09
【问题描述】:

我正在学习 SQL,我想创建一个查询来生成由表中的值组成的新列。我有一个名为transactions 的列,同一家公司有多个交易。表格看起来像这样:

Id  Name   Payd
1   John   5.00
2   Adam   5.00
3   John   10.00
4   John   10.00
5   Adam   15.00

我想做这样的事情:

Id  Name   5.00 10.00 15.00 Sum
1   John   5.00 20.00 0     25.00
2   Adam   5.00 0     15.00 20.00

我正在考虑使用PIVOT 函数来实现它,但我在实现时遇到了问题。我的代码如下所示:

(select emplployer, CAST (4.00 as decimal(10,0)) as [4.00],
CAST (5.00 as decimal(10,0)) as [5.00],
CAST (10.00 as decimal(10,0)) as [10.00],
CAST (18.00 as decimal(10,0)) as [18.00],
CAST (20.00 as decimal(10,0)) as [20.00]
from (select Name, cast(Payd as decimal(10,0)) as summ from employee) q1
pivot
(
    sum(summ) for employer in ([4.00], [5.00], [10.00], [18.00], [20.00])
)pvt;

【问题讨论】:

    标签: sql sql-server tsql pivot


    【解决方案1】:

    条件聚合方法:

    SELECT
        Name
        ,SUM(CASE WHEN Payd = 5 THEN Payd ELSE 0 END) as [5.00]
        ,SUM(CASE WHEN Payd = 10 THEN Payd ELSE 0 END) as [10.00]
        ,SUM(CASE WHEN Payd = 15 THEN Payd ELSE 0 END) as [15.00]
        ,SUM(Payd) as [Sum]
    FROM
        @Employees
    GROUP BY
        Name
    

    使用 Pivot 的一种方法:

    ;WITH cte AS (
        SELECT
           Name
           ,Payd
           ,Payd as PaydColNames
        FROM
           @Employees
    )
    
    SELECT
        Name
        ,[5.00] = ISNULL([5.00],0)
        ,[10.00] = ISNULL([10.00],0)
        ,[15.00] = ISNULL([15.00],0)
        ,[Sum] = ISNULL([5.00],0) + ISNULL([10.00],0) + ISNULL([15.00],0)
    FROM
        cte
        PIVOT (
           SUM(Payd) FOR PaydColNames IN ([5.00],[10.00],[15.00])
        ) p
    

    您似乎遇到的问题是您尝试使用同一列来透视您聚合的数据,这不会给您想要的结果。因此,您必须复制 Payd 列,以便可以将数据用作 PIVOT 和 Aggregate。然后,因为当值为 NULL 时您需要 0,所以您必须使用 ISNULL 或 COALESCE 来消除 NULL。在我看来,条件聚合会更好地为您提供这样的用途。

    测试数据

    DECLARE @Employees AS TABLE (Id INT, Name VARCHAR(50), Payd MONEY)
    INSERT INTO @Employees VALUES
    (1,'John',5.00)
    ,(2,'Adam',5.00)
    ,(3,'John',10.00)
    ,(4,'John',10.00)
    ,(5,'Adam',15.00)
    

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2021-10-25
      • 2012-12-06
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      相关资源
      最近更新 更多