Где я размещаю предложение WHERE в PIVOT с транзакцией даты

amount_usd paytype SendItemDateTime1 5.00 google 2015-04-01 2.00 google 2015-04-01 5.00 transfer 2015-04-01 15.00 google 2015-04-01 5.00 google 2015-04-01 2.00 google 2015-04-02 60.00 google 2015-04-02 60.00 google 2015-04-02 5.00 google 2015-04-03 

Выше представлена ​​моя демо-база данных с столбцами amount_usd, paytype и SendItemDateTime1. когда я использую pivok с запросом ниже, он дает результат ниже, который SendItemDateTime1 не является группой … в чем проблема?

  select amount_usd, paytype, SendItemDateTime1 from tblMobile_RequestOrderLog where status = 1 and sendstatus = 1 and enable = 1 and SendItemDateTime1 between '4/1/2015' and '4/30/2015' order by SendItemDateTime1 

Ниже приведен результат запроса.

 SenditemDateTime1 google mol molpay molstore paypal transfer 2015-04-01 15.00 NULL NULL NULL NULL NULL 2015-04-01 5.00 NULL NULL NULL NULL NULL 2015-04-01 15.00 NULL NULL NULL NULL NULL 2015-04-01 5.00 NULL NULL NULL NULL NULL 2015-04-01 60.00 NULL NULL NULL NULL NULL 2015-04-01 10.00 NULL NULL NULL NULL NULL 

И ниже – это то, что я хочу …

 SendItemDate google mol molpay molstore paypal transfer 2015-04-01 32 0 0 0 0 5 2015-04-02 122 0 0 0 0 0 2015-04-03 5 0 0 0 0 0 

извините, первый раз поставил вопрос здесь …

редактировать

Эта работа для меня с предложением «Где»:

 SELECT SendItemDateTime1, COALESCE([google], 0), COALESCE([transfer], 0), COALESCE([paypal], 0),COALESCE([molpay], 0) FROM (Select SendItemDateTime1, paytype, amount_usd from tblMobile_RequestOrderLog where gameidn = 248 and status = 1 and sendstatus = 1 and enable = 1 and SendItemDateTime1 between '4/1/2015 12:00:00 AM' and '4/30/2015 11:59:59' ) X PIVOT ( SUM(amount_usd) for [paytype] IN ([google],[transfer],[paypal],[molpay]) ) piv; 

Вы можете сворачивать данные в своей первой таблице с помощью следующего запроса – вам просто нужно явно указать все столбцы типов платежей. Я предположил, что SUM() как агрегирование:

 SELECT SendItemDateTime1, [google],[transfer],[paypal],[molpay] FROM MyTable PIVOT ( SUM(amount_usd) for [paytype] IN ([google],[transfer],[paypal],[molpay]) ) piv; 

SqlFiddle здесь

Изменить, Re, где я фильтрую

Если предикат фильтра может быть применен к конечным столбцам, то после PIVOT может применяться WHERE. В противном случае, если фильтрация должна выполняться в незащищенных столбцах, вы можете использовать CTE или производную таблицу, как вы это сделали. Вот пример предварительного фильтра в CTE и postfilter WHERE:

 -- Prefilter of non-pivot columns done in CTE or Derived table WITH cte AS ( SELECT [amount_usd], [paytype], [SendItemDateTime1] FROM MyTable WHERE [amount_usd] > 2 ) SELECT SendItemDateTime1, COALESCE([google], 0), COALESCE([transfer], 0), COALESCE([paypal], 0),COALESCE([molpay], 0) FROM cte PIVOT ( SUM(amount_usd) for [paytype] IN ([google],[transfer],[paypal],[molpay]) ) piv -- Post filter of pivot columns done on the final projection WHERE SendItemDateTime1 > '2015-01-01'; 

Обновленный скрипт

Давайте будем гением компьютера.