我正在尝试转动数据库,以便只有某些行成为列。以下是我的表格:
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
我想解决两个主要问题。
1st:我想要获得的值并不总是在同一列中。因此,虽然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
答案 0 :(得分:3)
在这种情况下,使用条件聚合进行分组应该有效。尝试类似:
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不能一步完成,特别是当您需要来自不同列的值时。你可以在两个查询中转移你的表并加入它们,但它的表现很差,而且比我的建议更不易读。