0

複雑な集計ビューの方法

、、およびを含むテーブル(Table A)が[payment type]あり[Agent],[Amount Credit]ます[Amount Debit]。今、私はこのデータの特定のビューを探しています。

私は各エージェントに彼/彼女の活動の要約が欲しいです。

したがって、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 

すべてを試しましたが、まだこのビューを取得できません。

4

2 に答える 2

2

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 FiddlewithDemoを参照してください。

数が不明な場合は、agents動的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)

SQL FiddlewithDemoを参照してください。クエリの結果は次のようになります。

| 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 |
于 2013-03-04T14:41:21.087 に答える
1

あなたがPIVOTのようなことをしようとしているように聞こえます:

CREATE TABLE #Table 
(
    [PayType] VARCHAR(100),
    [Name] VARCHAR(100),
    [Amt1] INT,
    [Amt2] INT
)

INSERT INTO #Table VALUES
('Cash','michaeljackson',1,9),
('Credit','michaeljackson',1,9),
('Cash','jq',10,20),
('Credit','jq',7,9),
('Cash','phil',1,2),
('Credit','phil',3,4),
('Cash','simplesimon',99,1),
('Credit','simplesimon',101,2);


SELECT *
FROM 
    ( 
    SELECT  PayType,
        Name,
        Amt1
    FROM    #Table
    ) AS sourceTable
    PIVOT
    (
    SUM(Amt1) FOR Name IN ("michaeljackson","jq","phil", "simplesimon") 
    ) AS pivotTable;

SELECT *
FROM 
    ( 
    SELECT  PayType,
        Name,
        Amt2
    FROM    #Table
    ) AS sourceTable
    PIVOT
    (
    SUM(Amt2) FOR Name IN ("michaeljackson","jq","phil", "simplesimon") 
    ) AS pivotTable;
于 2013-03-04T14:51:50.690 に答える