具有交叉联接反透视的 SQL Server

Posted

技术标签:

【中文标题】具有交叉联接反透视的 SQL Server【英文标题】:SQL Server with Cross Join Unpivot 【发布时间】:2016-12-06 05:53:39 【问题描述】:

我有一个独特的交叉申请。我有一张看起来像这样的桌子。

ID

我想看看是否可以将其拆分为 2 行和 4 列。 我想把SUB和APP一起拆分。

ClaimID === SUB Cost === APP Cost === Cost Type
109508  === 51.86    === 0.00     === "Parts"
109508  === 318.08   === 0.00     === "Labor"

这允许表格为每个类别的 SUB 与 APP 成本有一个简单的一行。我真的很感激这方面的一些帮助。作为旁注,我能够做到这一点,其中 1 行变成 4 行,SUB 和 APP 分别位于不同的行(每列一行),但随后我们失去了在行上比较 SUB 与 APP 的能力.

【问题讨论】:

虽然您正在重新排列数据,但这与人们所说的“标准化”无关。 【参考方案1】:

这是使用Cross Apply取消透视数据的一种方法

SELECT ClaimId,
       [Sub Cost],
       [App Cost],
       [Cost Type]
FROM   yourtable
       CROSS apply (VALUES (SUB_AllParts,APP_AllParts, 'Parts'),
                           (SUB_AllLabor,APP_AllLabor,'Labor')) 
                           tc ([Sub Cost], [App Cost], [Cost Type]) 

【讨论】:

【参考方案2】:

试试这个:

select claimid
        ,sub_allparts as 'sub cost'
        ,app_allparts as 'app cost'
        ,'"Parts"' as 'Cost Type'  
        from claim 
union all
select claimid
        ,sub_alllabor as 'sub cost'
        ,app_alllabor as 'app cost'
        ,'"Labor"' as 'Cost Type' 
         from claim 

【讨论】:

以上是关于具有交叉联接反透视的 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

动态 SQL 使用多列交叉应用来反透视数据

如何在 SQL Server 的交叉应用联接中指定列名

SQL联接 外联接 内联接 完全联接 交叉联接

Sql 查询交叉变换或透视?

T-SQL基础教程Day3

MySQL 交叉联接查询上的休眠异常