加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何在sql中将两行合并为一行?

发布时间:2021-01-02 02:34:14 所属栏目:MsSql教程 来源:网络整理
导读:我有一张桌子 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 15

我有一张桌子

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 |

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读