2013-05-16 87 views
0

我需要有2列的結果。 1源表/視圖有一個名爲「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 

list_of_months子查詢只是用來獲取的月表2012年1月和2013年十二月間這可能是任何表,唯一的要求是,它包含了它作爲許多行,因爲你需要幾個月來報告。在這種情況下,我們假設表格至少有24行。

另外我有一個Oracle背景,它看起來像你在SQL Server環境中,所以你需要將Oracle函數轉換爲SQL函數。我希望這有幫助。

UPDATE 我在SQL Server上做了一些Google操作,我認爲下面的查詢應該可以工作。再次,我確信有人更熟悉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服務器環境中,準確地說我在Visual Studio 2012中使用查詢生成器來獲取圖表對象的數據。我測試了你的代碼,當然它不會與Oracle功能一起工作,所以它失敗了,但是!我想說謝謝,因爲它爲解決方案奠定了基礎!謝謝! – Coogrrr