2015-12-07 5 views
0

Я борюсь с созданием стержня против таблицы транзакционных данных. В таблице данных у меня есть выглядит следующим образом:Сводка с несколькими столбцами

+------------+------------+-----------+------------+ 
|Date  |Store  |Customer |Value  | 
+------------+------------+-----------+------------+ 
|01/12/15 |StoreA  |Cust1  |3.80  | 
|01/12/15 |StoreB  |Cust2  |2.40  | 
|01/12/15 |StoreC  |Cust1  |3.80  | 
|02/12/15 |StoreC  |Cust2  |1.50  | 
|02/12/15 |StoreA  |Cust2  |1.50  | 
|02/12/15 |StoreA  |Cust2  |2.00  | 

В результате я пытаюсь получить от поворота следующим образом:

+-------+-----------+--------+--------+--------+--------+--------+--------+ 
|Date |Customer |StoreA |StoreB |StoreC |StoreAct|StoreBct|StoreCct| 
+--------+----------+--------+--------+--------+--------+--------+--------+ 
|01/12/15|Cust1  |3.80 |  |3.80 |1  |  |1  | 
|01/12/15|Cust2  |2.40 |  |  |1  |  |1  | 
|02/12/15|Cust2  |3.50 |  |1.50 |2  |  |  | 

При значении StoreA быть ВС всех сделок в эту дату, а StoreAct - количество транзакций в этом магазине за день.

После некоторых поисков я попытался следующие, но это не дает желаемого результата:

SELECT * 
FROM (
    SELECT 
     Date, Customer, Value, Store, 1 as TransCount, Store+'ct' as storecount 
    FROM SourceTable 
) as s 
PIVOT 
(
    SUM(Value) 
    FOR Customer IN (StoreA, StoreB, StoreC) 
)AS pvt 

PIVOT 
(
SUM(Transcount) 
FOR customer IN (StoreAct, StoreBct, StoreCct) 
)AS pvt 

Все и любая помощь будет высоко ценится, благодаря

+0

за один вы говорите, 'Для клиента в (StoreA ...', когда вы должны сказать 'для магазина IN (StoreA, ...' – JamieD77

ответ

0

Ваши заявления шарнирных были с помощью For Customer вместо фактического столбца, который вы пытались свернуть.

Вы должны также использовать функцию окна Count() Over() вместо 1 as TransCount, чтобы получить правильные подсчеты.

Это можно сделать динамически, легко заменив суммы в инструкции select и имена столбцов в сводных операциях.

SELECT 
    [Date], 
    Customer, 
    SUM(StoreA) StoreA, 
    SUM(StoreB) StoreB, 
    SUM(StoreC) StoreC, 
    SUM(StoreAct) StoreAct, 
    SUM(StoreBct) StoreBct, 
    SUM(StoreCct) StoreCct 
FROM 
    (SELECT 
     Date, 
     Customer, 
     Value, 
     Store, 
     COUNT(*) OVER (PARTITION BY date,customer,store) AS TransCount, 
     Store + 'ct' AS storecount 
    FROM 
     SourceTable 
    ) AS s 
PIVOT 
(SUM(Value) FOR [Store] IN ([StoreA],[StoreB],[StoreC])) AS pvt 
PIVOT 
(SUM(Transcount) FOR storecount IN ([StoreAct],[StoreBct],[StoreCct])) AS pvt 
GROUP BY 
    [Date], 
    Customer 
+0

Спасибо за быстрый и правильный ответ, он решил моя проблема и была тщательно выложена, поэтому я могу понять, как это работает. Спасибо за вашу помощь! – Sapling

Смежные вопросы