【问题标题】:Pivot outputs two valuesPivot 输出两个值
【发布时间】:2017-10-20 03:30:56
【问题描述】:
create table #Contact(
 LoanNumber int,
 ContactType varchar(10),
 CompanyName varchar(10),
 CompanyPhone varchar(10),
 CONSTRAINT PK PRIMARY KEY (LoanNumber,ContactType)
)

Insert into #Contact
values (1,'Appriaser','Yige King','11' ),
       (1,'AssetOwner','gqqnbig','22' )

这是我的桌子。 ContactTypes 只有 Appriaser 和 AssetOwner。

我可以得到一张这样的桌子

LoanNumber  AppraiserCompanyName    AppraiserCompanyPhone   AssertOwnerCompanyName  AssertOwnerCompanyPhone
----------------------------------------------------------------------------------------------------
6103339     YigeKing                11                      gqqnbig                 22

我设法写了这个

select LoanNumber,
        CompanyNamePT.Appriaser as AppriaserCompanyName, CompanyNamePT.AssetOwner as AssetOwnerCompanyName
        --CompanyPhonePT.Appriaser as AppriaserCompanyPhone, CompanyPhonePT.AssetOwner as AssetOwnerCompanyPhone
from  (
    select #contact.LoanNumber, #contact.ContactType, #contact.CompanyName
    from #contact
) as c
pivot ( max(c.CompanyName) for c.ContactType in (Appriaser,AssetOwner)) as CompanyNamePT
--pivot ( max(c.CompanyPhone) for c.ContactType in ([Appriaser],[AssetOwner])) as CompanyPhonePT

它输出公司名称,但如果我取消注释这两行以获取电话号码,则会引发语法错误。

我怎样才能让它工作?理想情况下,我想使用枢轴,因为我正在学习它。

【问题讨论】:

    标签: sql tsql pivot sql-server-2014


    【解决方案1】:

    对于所需的 PIVOT

    Select *
     From (
            Select C.LoanNumber
                  ,B.*
             From  #Contact C
             Cross Apply ( values (IIF(ContactType='Appriaser'  ,'AppraiserCompanyName' , 'AssetOwnerCompanyName') ,C.CompanyName)
                                 ,(IIF(ContactType='Appriaser' , 'AppraiserCompanyPhone', 'AssetOwnerCompanyPhone'),C.CompanyPhone)
                         ) B (Item,Value)
          ) A
    pivot ( max(A.Value) for A.Item in ([AppraiserCompanyName],[AppraiserCompanyPhone],[AssetOwnerCompanyName],[AssetOwnerCompanyPhone]) ) P
    

    但条件聚合也可以

    Select C.LoanNumber
          ,AppraiserCompanyName   =  max(case when ContactType='Appriaser'  then C.CompanyName end)
          ,AppraiserCompanyPhone  =  max(case when ContactType='Appriaser'  then C.CompanyPhone end)
          ,AssetOwnerCompanyName  =  max(case when ContactType='AssetOwner' then C.CompanyName end)
          ,AssetOwnerCompanyPhone =  max(case when ContactType='AssetOwner' then C.CompanyPhone end)
    From #Contact C
    Group By C.LoanNumber
    

    两者都会回归

    如果它有助于可视化,则生成带有交叉应用的子查询

    【讨论】:

    • 一个附带问题,我怎样才能完全符合 LoanNumber 的条件?我试着做c.LoanNumber,但它不起作用..
    • 我的意思是select LoanNumber,,为什么我不能写select c.LoanNumber
    • @LoveRight 你可以选择A.LoanNumber 我分配了一个别名A,不过换成C是小事,一会儿
    • 不错!最大方法甚至比枢轴更快!
    • @LoveRight 请记住,pivot 期望 X Y 和 Value。因此,在枢轴方法中,我们需要首先对数据进行 UNPIVOT。这是有代价的。也就是说,Pivot 在我的工具箱中仍然占有一席之地
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多