MySQL组按周编号/多个日期列

时间:2013-07-10 06:17:46

标签: mysql sql

我的表格的列类似于下面的列,但有大约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

任何人都可以告诉我制定查询以获得我需要的最佳方法吗?

由于

3 个答案:

答案 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

sqlFiddle

你必须写下大约30个(你的日期列)左连接,并且要求是你的第一个日期列不应该有空周(计数为0)或连接将会错过。

答案 2 :(得分:0)

以防万一其他人提出同样的问题:

我没有尝试使用一些令人惊讶的查询,而是在调用此查询的程序中创建了一个date_columns_names数组和一个循环,并为每个date_column_name创建了执行teh asme查询。它有点慢,但确实有效