使用旋转将行转换为列
Convert rows to columns with pivoting
我正在学习 SQL,我想创建一个查询来生成由 table 中的值组成的新列。我有一个名为 transactions
的列,同一家公司有多个交易。 Table 看起来像这样:
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 和聚合。然后因为当值为 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)
我正在学习 SQL,我想创建一个查询来生成由 table 中的值组成的新列。我有一个名为 transactions
的列,同一家公司有多个交易。 Table 看起来像这样:
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 和聚合。然后因为当值为 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)