Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как в PIVOT получить то что не попало с заданный список?  [new]
Dima T
Member

Откуда:
Сообщений: 15863
Например есть таблица отгрузок: Клиент, Товар, Сумма
надо построить выборку с колонками: Товар, Сумма клиента1, Сумма клиента2, Сумма клиента3, Сумма остальных клиентов.
Без последней колонки запрос такой получается:
SELECT nTovarId, [1] as C1, [2] as C2, [3] as C3
FROM
(SELECT nTovarId, nClientId, nSum FROM MyTable) As SourceTable
PIVOT
(Sum(nSum) FOR nClientId IN ([1], [2], [3])) As PivotTable

Есть какой-то синтаксис чтобы в IN добавить сумму остальных клиентов? Ну или всех в крайнем случаею

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64)
26 янв 12, 13:46    [11975417]     Ответить | Цитировать Сообщить модератору
 Re: Как в PIVOT получить то что не попало с заданный список?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dima T
Есть какой-то синтаксис чтобы в IN добавить сумму остальных клиентов? Ну или всех в крайнем случаею

Перечислить всех клиентов
26 янв 12, 13:57    [11975544]     Ответить | Цитировать Сообщить модератору
 Re: Как в PIVOT получить то что не попало с заданный список?  [new]
Dima T
Member

Откуда:
Сообщений: 15863
Glory
Перечислить всех клиентов

Это понятно что можно перечислить а потом сложить, только их несколько тысяч, а надо три конкретных и все остальные вместе.

Проще отдельным подзапросом посчитать по всем и вычесть этих трех.

Думал может есть еще проще способы.
26 янв 12, 14:04    [11975603]     Ответить | Цитировать Сообщить модератору
 Re: Как в PIVOT получить то что не попало с заданный список?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dima T
Это понятно что можно перечислить а потом сложить, только их несколько тысяч, а надо три конкретных и все остальные вместе.

Ну так напишите сначала запрос, которые проагрегирует всех остальных в клиента с каким нибудь фиктивным id вроде 666666 или 99999999
26 янв 12, 14:12    [11975674]     Ответить | Цитировать Сообщить модератору
 Re: Как в PIVOT получить то что не попало с заданный список?  [new]
Dima T
Member

Откуда:
Сообщений: 15863
Сгруппировал:
SELECT nTovarId, [1] as C1, [2] as C2, [3] as C3, [0] as C0
FROM
(SELECT nTovarId, case when nClientId in (1, 2, 3) then nClientId else 0 end as nClientId, nSum FROM MyTable) As SourceTable
PIVOT
(Sum(nSum) FOR nClientId IN ([1], [2], [3], [0])) As PivotTable

Работает, только глаза сломать можно пока прочитаешь.

Попробовал тоже самое обычной группировкой с SUM(CASE ... END) - скорость чуть медленнее (174 сек. против 164 сек) зато читабельно все и IDшники три раза не надо дублировать.

Думал какое-то серъезное ускорение от PIVOT будет. Вобщем без него проживу.
26 янв 12, 14:42    [11976004]     Ответить | Цитировать Сообщить модератору
 Re: Как в PIVOT получить то что не попало с заданный список?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dima T
Работает, только глаза сломать можно пока прочитаешь.

Чтобы не ломать глаза, были придуманы представления
26 янв 12, 21:48    [11979601]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить