2010-12-06 2 views
0

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

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

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 
    ) 

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

ответ

1

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

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, чтобы получить меньше.
  • Должен быть лучший способ «очистить» дату и время в форме «год-месяц», использовать его, если вы найдете его
  • Я проверил это на собственной таблице simlar, а затем перевел на ваши имена - Я уверен, что все в порядке, но некоторые опечатки, возможно, поскользнулись. (Я использовал SQL 2005.)
+0

Проблема в том, что мне нужны столбцы. Поэтому вместо того, чтобы заказывать их. Мне нужно отправлено, доставлено, возвращено на январь 2010 года, затем отправлено, отправлено, возвращено на февраль 2010 года. Все это нужно заказать. – Tom 2010-12-06 15:47:48

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