簡體   English   中英

通過旋轉將行轉換為列

[英]Convert rows to columns with pivoting

我正在學習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;

條件聚合方法:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM