2011-05-24 161 views
5

搞清楚什麼罪名按月加入1-12一堆計數的列?......在SQLSQL查詢每月

SELECT 
    months???, 
    count(whatever1) count1, 
    count(whatever2) count2 
FROM 
    months???? 
    LEFT JOIN whatever1 ON 
     month(whatever1.Date) = months???.monthid 
    LEFT JOIN whatever2 ON 
     month(whatever2.Date) = months???.monthid 
GROUP BY 
    months??? 

東西會落得像

的好方法
"month","whatever1count","whatever2count" 
1,null,5 
2,null,3 
3,null,null 
4,2,3 
5,36,73 
6,2,null 
7,45,944 
8,null,12 
9,1467,3 
10,null,2 
11,3,25 
12,4,null 

編輯 - 基本上哪裏是一個華而不實的辦法讓我的月列表/表/無論

+1

你正在使用哪個數據庫--MSSQL,Oracle,MySQL?它們都以微妙的方式不同。 – 2011-05-24 19:44:04

+0

@ Steviepoo- MSSQL – spaghetticowboy 2011-05-24 19:45:52

回答

4

方法很多......一個在以前的工作在許多應用中運作良好,對我來說是要建立的表時限。

id - Year - Month - StartStamp   - End Stamp 
1 - 2008 - January - 1/1/2008 00:00:00.000 - 1/31/2008 23:59:59.999 

然後,您可以只加入時間表,其中您的日期字段介於startstamp和endstamp之間。

這可以很容易地拉開一定的時間段,或者所有時間段......

此致可能很簡單,只有12條(即1 - 1月)和連接上DATEPART(男,DateColumn)

select mon.monthNumber, mon.monthName, 
     count(a.*) as count1, count(b.*) as count2 
from months mon 
left join whatever1 a on DATEPART(m,a.Date) = mon.monthNumber 
left join whatever2 b on DATEPART(m,b.Date) = mon.monthNumber 
group by mon.monthNumber, mon.monthName 

你也可以做的事情每月點對點,像這樣:

select mon.monthNumber, mon.monthName, 
     count(a.*) as count1, count(b.*) as count2 
from (
    select 1 as monthNumber, 'January' as monthName 
    union 
    select 2 as monthNumber, 'February' as monthName 
    union 
    select 3 as monthNumber, 'March' as monthName 
    union 
    ......etc..... 
) mon 
left join whatever1 a on DATEPART(m,a.Date) = mon.monthNumber 
left join whatever2 b on DATEPART(m,b.Date) = mon.monthNumber 
group by mon.monthNumber, mon.monthName 
+0

有點兒不錯,可能只是明確定義一個臨時表或其他東西,但這樣可以解決工作 – spaghetticowboy 2011-05-24 20:01:25

+1

這是一個非常好的方法。如果您在合理的時間範圍內創建每天有記錄的表格,則可以進行各種奇怪的操作,例如在週末,週末和節假日爲非標準日曆(如廣播或製造/會計)或羣組相關記錄進行會計處理。 – Olaf 2011-05-24 20:07:59

+0

是否存在針對此問題的僅查詢解決方案或正在創建真正必要的表? – payling 2011-06-06 16:55:39

4

基本上哪裏是一個漂亮的方式來獲得 我的月份列表/表格/任何

您可以使用遞歸cte來構建月份列表。

;with Months(MonthNum) as 
(
    select 1 MonthNum 
    union all 
    select MonthNum+1 
    from Months 
    where MonthNum < 12 
) 

-- Your query goes here 
select * 
from Months 
+0

完全是我以前做過的,非常高效的方式:) – 2011-05-24 20:53:18