2011-05-24 159 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