2

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

ETC

我的查询是

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

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

谢谢

4

3 回答 3

0

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

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

于 2013-07-23T04:34:13.210 回答
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;

这是我的小提琴演示

于 2013-07-10T06:29:33.420 回答
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),否则连接将丢失。

于 2013-07-10T06:53:03.103 回答