我的表格的列类似于下面的列,但有大约30个日期列和500多条记录
id | forcast_date | actual_date
1 10/01/2013 12/01/2013
2 03/01/2013 06/01/2013
3 05/01/2013 05/01/2013
4 10/01/2013 09/01/2013
我需要做的是获得类似于
的输出查询week_no | count_forcast | count_actual
1 4 6
2 5 7
3 2 1
等
我的查询是
SELECT weekofyear(forcast_date) as week_num,
COUNT(forcast_date) AS count_forcast ,
COUNT(actual_date) AS count_actual
FROM
table
GROUP BY
week_num
但我得到的是每列重复的forcast_date计数,即
week_no | count_forcast | count_actual
1 4 4
2 5 5
3 2 2
任何人都可以告诉我制定查询以获得我需要的最佳方法吗?
由于
答案 0 :(得分:0)
尝试:
SELECT WeekInYear, ForecastCount, ActualCount
FROM ( SELECT A.WeekInYear, A.ForecastCount, B.ActualCount FROM (
SELECT weekofyear(forecast_date) as WeekInYear,
COUNT(forecast_date) as ForecastCount, 0 as ActualCount
FROM TableWeeks
GROUP BY weekofyear(forecast_date)
) A
INNER JOIN
( SELECT * FROM
(
SELECT weekofyear(forecast_date) as WeekInYear,
0 as ForecastCount, COUNT(actual_date) as ActualCount
FROM TableWeeks
GROUP BY weekofyear(actual_date)
) ActualTable ) B
ON A.WeekInYear = B.WeekInYear)
AllTable
GROUP BY WeekInYear;
这是我的Fiddle Demo
答案 1 :(得分:0)
尝试:
SELECT weekofyear(forcast_date) AS week_forcast,
COUNT(forcast_date) AS count_forcast, t2.count_actual
FROM
t t1 LEFT JOIN (
SELECT weekofyear(actual_date) AS week_actual,
COUNT(forcast_date) AS count_actual
FROM t
GROUP BY weekOfYear(actual_date)
) AS t2 ON weekofyear(forcast_date)=week_actual
GROUP BY
weekofyear(forcast_date), t2.count_actual
你必须写下大约30个(你的日期列)左连接,并且要求是你的第一个日期列不应该有空周(计数为0)或连接将会错过。
答案 2 :(得分:0)
以防万一其他人提出同样的问题:
我没有尝试使用一些令人惊讶的查询,而是在调用此查询的程序中创建了一个date_columns_names数组和一个循环,并为每个date_column_name创建了执行teh asme查询。它有点慢,但确实有效