我有一张 table
EmployeeID IndividualPay FamilyPay IsActive
1 200 300 true
1 100 150 false
但我希望输出如下(我想使用这个输出与其他一些表进行内部连接)
EmployeeID IndPay_IsActive IndPay_IsNotActive FamilyPay_IsActive FamilyPay_IsNotActive
1 200 100 300 150
我查看了
PIVOT
,但不确定如何在我的情况下使用它。
最佳答案
这种类型的转换称为枢轴。您没有指定正在使用的数据库,但您可以使用带有 CASE
的聚合函数。在任何系统中的表达式:
select employeeid,
max(case when IsActive = 'true' then IndividualPay end) IndPay_IsActive,
max(case when IsActive = 'false' then IndividualPay end) IndPay_IsNotActive,
max(case when IsActive = 'true' then FamilyPay end) FamilyPay_IsActive,
max(case when IsActive = 'false' then FamilyPay end) FamilyPay_IsNotActive
from yourtable
group by employeeid
见 SQL Fiddle with Demo
根据您的数据库,如果您有权访问
PIVOT
和 UNPIVOT
函数,然后它们可以用来得到结果。 UNPIVOT
函数转换 IndividualPay
和 FamilyPay
列成行。完成后,您可以使用 PIVOT
创建四个新列。功能:select *
from
(
select employeeid,
case when isactive = 'true'
then col+'_IsActive'
else col+'_IsNotActive' end col,
value
from yourtable
unpivot
(
value
for col in (IndividualPay, FamilyPay)
) unpiv
) src
pivot
(
max(value)
for col in (IndividualPay_IsActive, IndividualPay_IsNotActive,
FamilyPay_IsActive, FamilyPay_IsNotActive)
) piv
见 SQL Fiddle with Demo .
两者都给出相同的结果:
| EMPLOYEEID | INDIVIDUALPAY_ISACTIVE | INDIVIDUALPAY_ISNOTACTIVE | FAMILYPAY_ISACTIVE | FAMILYPAY_ISNOTACTIVE |
----------------------------------------------------------------------------------------------------------------
| 1 | 200 | 100 | 300 | 150 |
关于sql - 如何在sql中将两行合并为一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411239/