Sql 复杂聚合视图如何
复杂聚合视图如何 我有一张表(Sql 复杂聚合视图如何,sql,sql-server,pivot,unpivot,Sql,Sql Server,Pivot,Unpivot,复杂聚合视图如何 我有一张表(表a),上面有[付款类型]、[代理]、[金额贷记]和[金额贷记]。现在,我正在寻找该数据的特定视图 我想为每个代理人提供他/她的活动摘要 因此,沿x轴的代理和沿y轴的付款类型以及每个代理的总数 Transaction type Agent 1 Agent 2 Amount Credit Cash 20 40 Credit Card 20 20 Total
表a
),上面有[付款类型]
、[代理]、[金额贷记]
和[金额贷记]
。现在,我正在寻找该数据的特定视图
我想为每个代理人提供他/她的活动摘要
因此,沿x轴的代理和沿y轴的付款类型以及每个代理的总数
Transaction type Agent 1 Agent 2
Amount Credit
Cash 20 40
Credit Card 20 20
Total 40 60
Amount Debit
Cash 20 40
Credit Card 10 10
Total 30 50
尝试了所有操作,但仍无法获得此视图。您可以通过应用UNPIVOT
和PIVOT
函数来获得所需的结果。如果要将已知数量的agent
值转换为列,则可以对查询进行硬编码:
select
case when TransactionType is null then 'Total' else [Credit/Debit] end [Credit/Debit],
case when TransactionType is null then '' else TransactionType end TransactionType,
Sum([Agent 1]) Agent1,
sum([Agent 2]) Agent2
from
(
select [Agent],
[Credit/Debit],
PaymentType as TransactionType,
value
from TableA
unpivot
(
value
for [Credit/Debit] in ([AmountCredit], [AmountDebit])
) unpiv
) src
pivot
(
sum(value)
for agent in ([Agent 1], [Agent 2])
) piv
group by GROUPING SETS ([Credit/Debit], TransactionType), ([Credit/Debit]);
看
如果代理的数量未知,则需要使用动态SQL,但不能在视图中使用动态SQL,必须将代码放在存储过程中。动态SQL将是:
DECLARE @cols AS NVARCHAR(MAX),
@colSum AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Agent)
from TableA
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colSum = STUFF((SELECT distinct ', Sum(' + QUOTENAME(Agent)+') as ' +QUOTENAME(Agent)
from TableA
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'select
case when TransactionType is null then ''Total'' else [Credit/Debit] end [Credit/Debit],
case when TransactionType is null then '''' else TransactionType end TransactionType,
'+@colSum +'
from
(
select [Agent],
[Credit/Debit],
PaymentType as TransactionType,
value
from TableA
unpivot
(
value
for [Credit/Debit] in ([AmountCredit], [AmountDebit])
) unpiv
) src
pivot
(
sum(value)
for agent in ('+@cols+')
) piv
group by GROUPING SETS ([Credit/Debit], TransactionType), ([Credit/Debit])'
execute(@query)
看。查询结果将是:
| CREDIT/DEBIT | TRANSACTIONTYPE | AGENT 1 | AGENT 2 |
------------------------------------------------------
| AmountCredit | Cash | 20 | 40 |
| AmountCredit | Credit Card | 20 | 20 |
| Total | | 40 | 60 |
| AmountDebit | Cash | 20 | 40 |
| AmountDebit | Credit Card | 10 | 10 |
| Total | | 30 | 50 |
通过应用UNPIVOT
和PIVOT
函数,您可以得到想要的结果。如果要将已知数量的agent
值转换为列,则可以对查询进行硬编码:
select
case when TransactionType is null then 'Total' else [Credit/Debit] end [Credit/Debit],
case when TransactionType is null then '' else TransactionType end TransactionType,
Sum([Agent 1]) Agent1,
sum([Agent 2]) Agent2
from
(
select [Agent],
[Credit/Debit],
PaymentType as TransactionType,
value
from TableA
unpivot
(
value
for [Credit/Debit] in ([AmountCredit], [AmountDebit])
) unpiv
) src
pivot
(
sum(value)
for agent in ([Agent 1], [Agent 2])
) piv
group by GROUPING SETS ([Credit/Debit], TransactionType), ([Credit/Debit]);
看
如果代理的数量未知,则需要使用动态SQL,但不能在视图中使用动态SQL,必须将代码放在存储过程中。动态SQL将是:
DECLARE @cols AS NVARCHAR(MAX),
@colSum AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Agent)
from TableA
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colSum = STUFF((SELECT distinct ', Sum(' + QUOTENAME(Agent)+') as ' +QUOTENAME(Agent)
from TableA
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'select
case when TransactionType is null then ''Total'' else [Credit/Debit] end [Credit/Debit],
case when TransactionType is null then '''' else TransactionType end TransactionType,
'+@colSum +'
from
(
select [Agent],
[Credit/Debit],
PaymentType as TransactionType,
value
from TableA
unpivot
(
value
for [Credit/Debit] in ([AmountCredit], [AmountDebit])
) unpiv
) src
pivot
(
sum(value)
for agent in ('+@cols+')
) piv
group by GROUPING SETS ([Credit/Debit], TransactionType), ([Credit/Debit])'
execute(@query)
看。查询结果将是:
| CREDIT/DEBIT | TRANSACTIONTYPE | AGENT 1 | AGENT 2 |
------------------------------------------------------
| AmountCredit | Cash | 20 | 40 |
| AmountCredit | Credit Card | 20 | 20 |
| Total | | 40 | 60 |
| AmountDebit | Cash | 20 | 40 |
| AmountDebit | Credit Card | 10 | 10 |
| Total | | 30 | 50 |
听起来你想做些什么:
听起来你想做些什么:
您可能希望发布您已经尝试过的内容。如果代理的数量随时间而变化,则无法将其作为视图写入。SQL不是电子表格系统。查询生成的列数(及其类型和名称)是固定的。您可能希望发布您已经尝试过的内容。如果代理数随时间变化,则无法将其作为视图写入。SQL不是电子表格系统。查询生成的列数(以及它们的类型和名称)是固定的。+1这是一个很好的答案-涵盖所有内容-几乎试图删除我的尝试+1这是一个很好的答案-涵盖了所有内容-几乎想删除我的尝试!