2013-05-16 2 views
0

Мне нужно иметь 2 столбца для результата. 1 source table/view имеет поле «Date_Entered», которое равно yyyy-mm-dd hh.mm.ss для каждой записи (полная дата/время). Мне нужен запрос, который строит 2 столбца результатов. Результаты - общее количество записей в месяц в год. Будет выглядеть так ...

Year_2012 ..... Year_2013
498 ................. 132
134 ......... ........ 564
787 ................. 342
Сводные записи дважды

и т. Д. За 12 результатов в год (если применимо), что у меня есть до сих пор это .., который устанавливает первый столбец из 12 вариантов (1 в месяц) с общим количеством строк в течение каждого месяца.

SELECT COUNT(DATEPART(mm, Date_Entered)) AS Year_2012 
FROM cwwebapp_oti.dbo.v_cbi_All_Tickets 
WHERE (Company_Name IN ('Company, Inc.', 'Business LLC')) AND 
     (DATEPART(yyyy, Date_Entered) = '2012') 
GROUP BY DATEPART(mm, Date_Entered) 
ORDER BY DATEPART(mm, Date_Entered) 

Year_2012 
518 
452 
593 
810 
etc... 

Я исследовал и не нашел, как получить вторую сборку колонки из того же источника данных, но только показывает Year_2013 из которых есть 5 строк на сегодняшний день, конечно.

Заранее благодарим за любую помощь, которую вы можете предоставить!

~ Coog

ответ

0

Это возможное решение. Он ограничен, поскольку он работает только в течение лета 2012 и 2013 годов и нуждается в изменении, если вы хотите включить дополнительные годы. Это также не очень элегантно, и я уверен, что некоторые из гуру SQL на этом сайте смогут его упростить.

SELECT NVL(SUM(DECODE(date_entered_year, '2012', 1, 0)), 0) year_2012, 
     NVL(SUM(DECODE(date_entered_year, '2013', 1, 0)), 0) year_2013 
    FROM (SELECT TO_CHAR(date_entered, 'YYYY-MM') date_entered_month, 
       TO_CHAR(date_entered, 'YYYY') date_entered_year 
      FROM cwwebapp_oti.dbo.v_cbi_All_Tickets 
     WHERE company_name IN ('Company, Inc.', 'Business LLC') 
     ), 
     (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'YYYY-MM') year_month, 
       TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'MM') month 
      FROM cwwebapp_oti.dbo.v_cbi_All_Tickets 
     WHERE ROWNUM <= MONTHS_BETWEEN(TO_DATE('2013-12','yyyy-mm'), 
             TO_DATE('2012-01','yyyy-mm'))+1 
     ) list_of_months 
WHERE year_month = date_entered_month 
GROUP BY month 
ORDER BY month 

The list_of_months подзапроса используется только для того чтобы получить список месяцев между январем 2012 года и декабрем 2013 г. Это может быть любой таблица, с единственным требованием в том, что она содержит стольких строк, в нем, как вам нужно месяцев. В этом случае мы предполагаем, что таблица имеет не менее 24 строк.

Также у меня есть фон Oracle, и похоже, что вы находитесь в среде SQL Server, поэтому вам нужно преобразовать функции Oracle в функции SQL. Надеюсь, это поможет.

ОБНОВЛЕНИЕ Я немного поработал на SQL Server и думаю, что следующий запрос должен работать. Опять же, я уверен, что кто-то, кто разбирается в SQL Server, сможет его упростить.

SELECT SUM(CASE date_entered_year 
      WHEN '2012' THEN 1 
      ELSE 0 
      END) year_2012, 
     SUM(CASE date_entered_year 
      WHEN '2013' THEN 1 
      ELSE 0 
      END) year_2013 
    FROM (SELECT CAST(DATEPART(year, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR)+'-'+ 
       CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) y1, 
       CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) m1 
      FROM (SELECT row_number() OVER (ORDER BY id) as rn 
        FROM cwwebapp_oti.dbo.v_cbi_All_Tickets) sub1 
     WHERE rn <= DATEDIFF(mm, CONVERT(date, '20120101'), 
            CONVERT(date, '20131231'))+1 
     ) list_of_months LEFT OUTER JOIN 
     (SELECT CAST(DATEPART(year, date_entered) AS VARCHAR)+'-'+ 
       CAST(DATEPART(month, date_entered) AS VARCHAR) date_entered_month, 
       CAST(DATEPART(year, date_entered) AS VARCHAR) date_entered_year 
      FROM cwwebapp_oti.dbo.v_cbi_All_Tickets 
     WHERE company_name IN ('Company, Inc.', 'Business LLC') 
     ) company_data ON list_of_months.y1 = company_data.date_entered_month 
GROUP BY m1 
ORDER BY m1 
+0

Я нахожусь в среде MS SQL server, и, если быть точным, я в Visual Studio 2012, используя построитель запросов, чтобы получить данные для объекта диаграммы. Я протестировал ваш код, конечно, он не будет работать с функциями Oracle, так что это не сработало НО! Я хочу сказать спасибо, поскольку он все же устанавливает почву для решения! Благодаря! – Coogrrr

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