Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在具有多个和的多个列上旋转_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在具有多个和的多个列上旋转

Sql 在具有多个和的多个列上旋转,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下样本数据: +------+----+----+-----+-----+ |类型| Total1 | Total2 | Account1 | Account2| +------+----+----+-----+-----+ |调整|-2.14 | 2.14 | 1220 | 4110| |调整| 0.21 |-0.21 | 1220 | 4110| |调整|-6.43 | 6.43 | 1220 | 1220| +------+----+----+-----+-----+ 我要做的是透视

我有以下样本数据:

+------+----+----+-----+-----+ |类型| Total1 | Total2 | Account1 | Account2| +------+----+----+-----+-----+ |调整|-2.14 | 2.14 | 1220 | 4110| |调整| 0.21 |-0.21 | 1220 | 4110| |调整|-6.43 | 6.43 | 1220 | 1220| +------+----+----+-----+-----+ 我要做的是透视/求和,Account1列与Total1列相关,Account2表与Total2列相关

但在进行数据透视时,我需要按Account1和Account2的组合进行数据透视,并按该科目代码的相关合计列求和,因此使用此示例数据,我得到以下结果:

+------+----+---+ |类型| 1220 | 4110| +------+----+---+ |调整|-1.93 | 1.93| +------+----+---+ 到目前为止,我的两次尝试都包含了这一点,但并不完全如此。有人能告诉我我遗漏了什么吗

选择 类型 总和[1220]为[1220], 总和[4110]为[4110] 临时工 支点 sumTotal1 对于[1220],[4110]中的Account1 P 按类型分组 选择 类型 当Account1='1220'时为sumcase,当Account2='1220'时为Total1,则Total2结束为[1220], 当Account1='4110'时为sumcase,当Account2='4110'时为Total1,则Total2以[4110]结尾 临时工 按类型分组 样本数据:

创建临时表 varchar50型, 总共1美元, 总共2块钱, 会计1国际, 会计2国际 插入临时类型、Total1、Total2、Account1、Account2 选择“调整”、“2.14”、“2.14”、“1220”、“4110” 联合所有 选择“调整”、“0.21”、“-0.21”、“1220”、“4110” 联合所有 选择“调整”、“6.43”、“6.43”、“1220”、“1220”
我们可以尝试采用联合方法来处理这一问题:

WITH cte AS (
    SELECT [Type], Total1 AS Total, Account1 AS Account FROM #temp
    UNION ALL
    SELECT [Type], Total2, Account2 FROM #Temp
)

SELECT
    [Type],
    SUM(CASE WHEN Account = '1220' THEN Total ELSE 0 END) AS [1220],
    SUM(CASE WHEN Account = '4110' THEN Total ELSE 0 END) AS [4110]
FROM cte
GROUP BY
    Type;

这里的基本策略是将所有账目和总额分为两列,然后在这些单独的列上进行聚合/透视。这就解决了在多个列之间聚合数据的问题。最好的长期解决方案可能是更改数据结构,使帐户和合计只包含一列。

另一个选项是使用交叉应用程序取消对数据的分割,然后进行数据透视

范例

返回

Select *
 From  (
        Select A.[Type] 
              ,B.*
         from #Temp A
         Cross Apply ( values (Total1,Account1)
                             ,(Total2,Account2)
                     ) B (Value,Item)
       ) Src
 Pivot (sum(Value) for Item in ([1220],[4110]) ) pvt
Type        1220    4110
Adjustment  -1.93   1.93