SQL Pivot для нескольких строк ... CONFUSED? - PullRequest
0 голосов
/ 06 декабря 2010

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

Сейчас у меня есть транзакция, которая проходит.Есть 3 типа транзакций.Скажем, доставлено, отправлено, возвращено.Таким образом, моя таблица имеет идентификатор транзакции, дату транзакции и тип транзакции.Мне нужно повернуть это и посчитать, а затем суммировать типы транзакций.У меня есть этот код до сих пор:

SELECT
    SUM(Delivered),
    SUM(Shipped),
    SUM(Returned),
    TransactionID,
    TransactionDate
FROM
    (
        (SELECT
            TransactionID,
            TransactionDate,
            TransactionType
        FROM Transactions) AS Ttable
        PIVOT
        (
            COUNT(TransactionType)
            FOR TransactionTYpe IN
            (
                [Delivered],
                [Shipped],
                [Returned]
            )
         ) as Pvt1
    )

Это получает сумму счета для каждого типа транзакции.Однако, это дает мне итоги для ВСЕХ существующих типов транзакций.Мне нужно получить все это за отрезок времени.Например (и я знаю, что это будет много переменных, но только так мое приложение сможет это сделать), мне нужно выяснить сумму всех типов транзакций за январь 2010 - декабрь 2012 за каждый месяц.Итак, 12х3.Как я могу разбить это так?Пожалуйста помоги!Схожу с ума!

1 Ответ

1 голос
/ 06 декабря 2010

Вот отправная точка:

SELECT TransactionMonth, [Delivered], [Shipped], [Returned] 
 from (select
          TransactionType
         ,cast(datename(mm, TransactionDate) + ' 1,  ' + datename(yy, TransactionDate) as smalldatetime) TransactionMonth
        from Transactions) ByMonth
 pivot (count(ByMonth.TransactionType)
        for ByMonth.TransactionType in ([Delivered],[Shipped],[Returned] )
        ) xx
 order by TransactionMonth

Не совсем ясно, как выглядят исходные данные или какова ваша окончательная сетка, поэтому я сделал несколько предположений:

  • Я предполагаю, что для каждого TransactionId существует одна транзакция на одну дату. Я вычленяю это из окончательного запроса и генерирую итоги по календарному месяцу
  • Я возвращаю результаты для каждой записи в таблице. Добавьте предложение where с соответствующими параметрами фильтрации даты в предложение SELECT, чтобы получить меньше.
  • Должен быть лучший способ «очистить» дату и время от формы «год-месяц», используйте ее, если найдете ее
  • Я проверил это на собственной таблице симлара, а затем преобразовал в ваши имена - почти уверен, что все правильно понял, но некоторые опечатки могли проскочить. (Я использовал SQL 2005).
...