Раздвоение записей по месяцам

Здесь я собираюсь объяснить свой сценарий:

У меня есть следующие таблицы:

Table : Service_Type

Id  | Service_Name | Service_Table_Name|
----------------------------------------
1   |   FA         |    FA     |
2   |   TPA        |        TPA        |


Table: Service_Mapping

Id  | Service_Type_Id |
---------------------------
1   |   1     |
2   |   2     |
3   |   2     |
4   |   1     |

Table: FA

Id  | Created_date| Qty |
-----------------------------
1   | 3/20/2012   | 20  |
2   | 4/22/2012   | 10  |
3   | 5/12/2012   | 15  |
4   | 6/3/2012    | 5   |

Table: TPA

Id  | Created_date| Qty |
-----------------------------
1   | 5/20/2012   | 2   |
2   | 7/22/2012   | 10  |
3   | 1/12/2012   | 1   |
4   | 9/3/2012    | 5   |

Я хочу, чтобы вывод был таким:

Month | FA| TPA|
----------------
Jan     0   1
Mar     1   0
Apr     1   0
Jul     1   0
Sep     0   1

В выводе я хочу, чтобы месяц соответствовал полю Created_date таблицы FA и TPA. И в зависимости от месяца я хочу получить общую сумму, сколько FA и TPA происходит в месяц.

У меня есть вывод, например

FA   |  TPA  |
--------------
3    |  2    |

SELECT 
SUM(CASE WHEN Service_Type_Id = 1 THEN 1 ELSE 0 END) AS FA, 
SUM(CASE WHEN Service_Type_Id = 2 THEN 1 ELSE 0 END) AS TPA 
FROM Service_Mapping

Но теперь я хочу разделить их по месяцам, в которые они происходят. С даты подачи TPA и FA.


person IT_INFOhUb    schedule 15.04.2013    source источник


Ответы (2)


Попробуй это:

SELECT Mon.monthNAME, ISNULL(TPAcount,0) TPAcount, ISNULL(FAcount,0) FAcount FROM
(
    SELECT DATENAME(MONTH,created_date) AS [monthNAME], MONTH(created_date) [month], YEAR(created_date) as [year] FROM FA
    UNION
    SELECT DATENAME(MONTH,created_date) AS [monthNAME], MONTH(created_date) [month], YEAR(created_date) as [year]  FROM TPA
) Mon LEFT JOIN
(
    SELECT DATENAME(MONTH,created_date) tpaMonth, YEAR(created_date) as [year] , COUNT(1) TPAcount 
    FROM TPA GROUP BY DATENAME(MONTH,created_date), YEAR(created_date)
) TPA ON TPA.tpaMonth = Mon.monthNAME and tpa.[year] = mon.[year] LEFT JOIN
(
    SELECT DATENAME(MONTH,created_date) faMonth, YEAR(created_date) as [year] , COUNT(1) FAcount 
    FROM FA GROUP BY DATENAME(MONTH,created_date), YEAR(created_date)
) FA ON FA.faMonth = MON.monthNAME and FA.[year] = mon.[year]

ORDER BY 
 Mon.[year], Mon.[month]
person Konrad Z.    schedule 15.04.2013
comment
Я не знаю, почему он показывает мне это сообщение об ошибке ....... Сообщение об ошибке: «Mon.month» не является распознаваемым параметром имени даты. - person IT_INFOhUb; 15.04.2013
comment
Я не знаю, почему это не работает на вашем сайте. Я создал те же таблицы, что и у вас, у меня это отлично работает. Вы пробовали мои оба запроса? - person Konrad Z.; 15.04.2013

Вы также можете проверить другой подход:

SELECT Mon.monthNAME, SUM(tpCount) tpCount, SUM(faCount) faCount FROM
(
    SELECT DATENAME(MONTH,created_date) AS [monthNAME], MONTH(created_date) [month], YEAR(created_date) as [year], 0 AS tpCount, 1 as faCount FROM FA
    UNION
    SELECT DATENAME(MONTH,created_date) AS [monthNAME], MONTH(created_date) [month], YEAR(created_date) as [year], 1 as tpCount, 0 AS faCount FROM TPA
) Mon 
GROUP BY 
   [monthNAME],[month],[year]
ORDER BY 
    Mon.[year], Mon.[month]
person Konrad Z.    schedule 15.04.2013
comment
Этот запрос работает нормально. Но теперь, если я добавлю больше услуг, например. FA, TPA, Gift, AA и т. Д. Тогда какие изменения я должен сделать в этом? - person IT_INFOhUb; 15.04.2013
comment
Вам нужно будет добавить следующие союзы и добавить новые столбцы к текущим выборам. Например, если вы хотите добавить таблицу GIFT, вам нужно будет добавить 0 в качестве GiftCount в текущих выборках, а затем следующее объединение следующим образом: SELECT DATENAME(MONTH,created_date) AS [monthNAME], MONTH(created_date) [month], YEAR (created_date) как [год], 0 как tpCount, 0 как faCount, 1 как GiftCount FROM Gift - person Konrad Z.; 15.04.2013