2015-03-09 4 views
0

Я разрабатываю инструмент, который генерирует таблицу excel с результатами SQL. У меня есть несколько дней, несколько способов оплаты (fe: кредитная карта, чек, вид) и несколько сумм. Я делаю этот запрос:Строки для столбцов в SQL Server

SELECT TE.DATE AS 'JOUR', SUM(TE.TOTAL_TTC) AS 'CA TTC', ME.LIBELLE AS 'LIBELLE' 
FROM TICKET TE 
INNER JOIN MODE_REGLEMENT ME ON ME.CODE = TE.MODE_REGLEMENT 
GROUP BY TE.DATE, ME.LIBELLE 

(MODE_REGLEMENT означает способ оплаты)

И я иметь этот результат:

**JOUR**   **CA TTC**  **LIBELLE** 
07/03/2014   1409.66   CREDIT CARD 
07/03/2014   70    CHECK 
07/03/2014   1393.31   SPECIES 
08/03/2014   3368.07   CREDIT CARD 
08/03/2014   599.44   SPECIES 
09/03/2014   268.7   CREDIT CARD 
09/03/2014   174.62   CHECK 

Но я ищу, чтобы произвести что-то вроде этого:

**JOUR**  **CA TTC**  **CREDIT CARD**  **CHECK**  **SPECIES** 
07/03/2014 2872.97  1409.66    70   1393.31 
08/03/2014 3967.51  3368.07    0    599.44 
09/03/2014 443.32   268.7    174.62  0 

Столбец «CA TTC» будет представлять собой сумму каждого способа оплаты , Не могли бы вы помочь мне сделать запрос (для SQL Server), чтобы получить результат, который я хочу.

Большое вам спасибо! (простите за плохой английский я французский)

+1

Используйте PIVOT. Чтобы узнать о PIVOT Check LINK http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/ – ConsiderItDone

+0

Прочтите эту статью, я написал: http: // www .codeproject.com/Статьи/796651/Client-Side-Multi-Column-Dynamic-Pivot –

+0

спасибо, ребята :) – BlackAlpha

ответ

0

Вы должны использовать PIVOT

Найдите total за JOUR с помощью SUM over() в исходном запросе поворота.

SELECT jour, 
     CA_TTC=total, 
     [CREDIT CARD]=Isnull([CREDIT CARD], 0), 
     [CHECK]=Isnull([CHECK], 0), 
     [SPECIES]=Isnull([SPECIES], 0) 
FROM (SELECT *, 
       Sum(CA_TTC)OVER(partition BY JOUR) total 
     FROM Your_result) a 
     PIVOT (Max(CA_TTC) 
      FOR LIBELLE IN([CREDIT CARD], 
          [CHECK], 
          [SPECIES])) pv 
+0

PIVOT, похоже, будет хорошим способом, я попробую его Я ищу лучший модульный способ, это будет здорово, если пользователи смогут выбрать, LIBELLE 'они хотят отображать Спасибо – BlackAlpha

0

Другой способ заключается в использовании условной агрегации или SUM(CASE WHEN ... END):

;WITH CTE([JOUR], [CA TTC], [LIBELLE]) AS(
    SELECT 
     TE.DATE AS 'JOUR', 
     SUM(TE.TOTAL_TTC) AS 'CA TTC', 
     ME.LIBELLE AS 'LIBELLE' 
    FROM TICKET TE 
    INNER JOIN MODE_REGLEMENT ME ON ME.CODE = TE.MODE_REGLEMENT 
    GROUP BY TE.DATE, ME.LIBELLE 
) 
SELECT 
    [JOUR], 
    [CA TTC] = 
     SUM(CASE WHEN [LIBELLE] = 'CREDIT CARD' THEN [CA TTC] ELSE 0 END) + 
     SUM(CASE WHEN [LIBELLE] = 'CHECK' THEN [CA TTC] ELSE 0 END) + 
     SUM(CASE WHEN [LIBELLE] = 'SPECIES' THEN [CA TTC] ELSE 0 END), 
    [CREDIT CARD] = SUM(CASE WHEN [LIBELLE] = 'CREDIT CARD' THEN [CA TTC] ELSE 0 END), 
    [CHECK] = SUM(CASE WHEN [LIBELLE] = 'CHECK' THEN [CA TTC] ELSE 0 END), 
    [SPECIES] = SUM(CASE WHEN [LIBELLE] = 'SPECIES' THEN [CA TTC] ELSE 0 END)    
FROM CTE 
GROUP BY [JOUR] 
+0

Да, я знаю 'случай, когда я использую его в других запросах :) ваш метод кажется отличным, но я нахожу его немного избыточным – BlackAlpha

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