2013-03-04 2 views
0

комплекс вид aggregration каккомплекс вид aggregration как

У меня есть таблица (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 

Пробовал все и не мог получить этот вид еще.

+1

Вы можете отправить то, что вы уже пытались так или иначе. –

+0

Если количество агентов будет меняться со временем, нет возможности написать это как представление. SQL не является электронной таблицей. Исправлено количество столбцов (и их типов и имен), созданных запросом. –

ответ

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 Fiddle with Demo.

Если у вас есть неизвестное число 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, 
       '[email protected] +' 
       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 ('[email protected]+') 
      ) piv 
       group by GROUPING SETS ([Credit/Debit], TransactionType), ([Credit/Debit])' 

execute(@query) 

См. SQL Fiddle with Demo. Результат запроса будет:

| 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 | 
+0

+1 это отличный ответ - все покрытое - почти соблазн удалить мою попытку! – whytheq

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; 
Смежные вопросы