Sql server SQL Pivot仅选择行
我正在尝试透视数据库,以便只有某些行成为列。下面是我的桌子的样子:Sql server SQL Pivot仅选择行,sql-server,sql-server-2012,pivot,Sql Server,Sql Server 2012,Pivot,我正在尝试透视数据库,以便只有某些行成为列。下面是我的桌子的样子: ID QType CharV NumV 1 AccNum 10 1 EmpNam John Inc 0 1 UW Josh 0 2 AccNum 11 2 EmpNam CBS 0 2 UW Dan 0
ID QType CharV NumV
1 AccNum 10
1 EmpNam John Inc 0
1 UW Josh 0
2 AccNum 11
2 EmpNam CBS 0
2 UW Dan 0
我希望桌子看起来像这样:
ID AccNum EmpNam
1 10 John Inc
2 11 CBS
我有两个主要的问题要解释
第一:我试图获取的值并不总是在同一列中。因此,虽然AccNum始终位于NumV列中,但EmpName始终位于CharV列中
第二:我需要找到一种方法来忽略我不想要的数据。在本例中,它将是QType列中带有UW的行
以下是我的代码:
SELECT *
FROM testTable
Pivot(
MAX(NumV)
FOR[QType]
In ([AccNum],[TheValue])
)p
但它给了我以下的结果:
ID CharV AccNum TheValue
1 10 NULL
2 11 NULL
2 CBS NULL NULL
2 Dan NULL NULL
1 John IncNULL NULL
1 Josh NULL NULL
在这种情况下,应使用条件聚合进行分组。尝试以下方法:
SELECT ID
, MAX(CASE WHEN QType = 'AccNum' THEN NumV END) AS AccNum
, MAX(CASE WHEN QType = 'EmpNam' THEN CharV END) AS EmpNam
FROM testTable
GROUP BY ID
由于内部CASE仅在满足when条件时获取值,因此MAX函数将为您提供所需的值。当然,这只适用于每个ID只有唯一的QType的情况
通常,当您的条件复杂时,在Sql Server中使用PIVOT并不能一步到位,特别是当您需要来自不同列的值时。您可以在两个查询中旋转表并将它们连接起来,但它的性能会很差,并且不如我的建议可读。谢谢您,这非常有效!我感谢你给了我最简单最简单的答案,而不是我认为我想要的。