Group By未正确分组

时间:2011-07-19 13:57:07

标签: oracle

我正在使用oracle,它的group by子句似乎与我期望的行为完全不同。

使用此查询时:

SELECT stats.gds_id,
  stats.stat_date,
  SUM(stats.A_BOOKINGS_NBR) as "Bookings",
  SUM(stats.RESPONSES_LESS_1_NBR) as "<1",
  SUM(stats.RESPONSES_LESS_2_NBR) AS "<2",
  SUM(STATS.RESPONSES_LESS_3_NBR) AS "<3",
  SUM(stats.RESPONSES_LESS_4_NBR) AS "<4",
  SUM(stats.RESPONSES_LESS_5_NBR) AS "<5",
  SUM(stats.RESPONSES_LESS_6_NBR + stats.RESPONSES_LESS_7_NBR + stats.RESPONSES_GREATER_7_NBR) AS ">5",
  SUM(stats.RESPONSES_LESS_6_NBR) AS "<6",
  SUM(stats.RESPONSES_LESS_7_NBR) AS "<7",
  SUM(stats.RESPONSES_GREATER_7_NBR) AS ">7",
  SUM(stats.RESPONSES_LESS_1_NBR + stats.RESPONSES_LESS_2_NBR + stats.RESPONSES_LESS_3_NBR + stats.RESPONSES_LESS_4_NBR + stats.RESPONSES_LESS_5_NBR + stats.RESPONSES_LESS_6_NBR + stats.RESPONSES_LESS_7_NBR + stats.RESPONSES_GREATER_7_NBR) as "Total"
FROM gwydb.statistics stats
WHERE stats.stat_date >= '01-JUN-2011'
GROUP BY stats.gds_id, stats.stat_date

我得到的结果如下:

GDS_ID  STAT_DATE   Bookings    <1      <2  <3  <4  <5  >5  <6  <7  >7  Total    
02      12-JUN-11   0           1       0   0   0   0   0   0   0   0   1
1A      01-JUN-11   15          831     52  6   2   2   4   1   1   2   897
1A      01-JUN-11   15          758     59  8   1   1   5   2   1   2   832
1A      01-JUN-11   10          593     40  2   2   1   2   1   0   1   640
1A      01-JUN-11   12          678     40  10  5   2   3   1   0   2   738
1A      01-JUN-11   24          612     56  6   1   3   4   0   0   4   682
1A      01-JUN-11   23          552     37  7   1   1   2   0   1   1   600
1A      01-JUN-11   35          1147    132 13  6   0   8   0   2   6   1306
1A      01-JUN-11   91          2331    114 14  5   1   14  3   1   10  2479

如您所见,我每个GDS_ID有多个重复的STAT_DATE。为什么会这样,我怎样才能将它们组合在一起呢? I.E.对每个STAT_DATE的每个GDS_ID的值求和。

1 个答案:

答案 0 :(得分:7)

可能是因为STAT_DATE有一个时间组件,它在GROUP BY中被考虑在内但由于默认格式掩码而未显示在结果中。要忽略时间,请执行以下操作:

SELECT stats.gds_id,
  TRUNC(stats.stat_date) stat_date,
  SUM(stats.A_BOOKINGS_NBR) as "Bookings",
  SUM(stats.RESPONSES_LESS_1_NBR) as "<1",
  SUM(stats.RESPONSES_LESS_2_NBR) AS "<2",
  SUM(STATS.RESPONSES_LESS_3_NBR) AS "<3",
  SUM(stats.RESPONSES_LESS_4_NBR) AS "<4",
  SUM(stats.RESPONSES_LESS_5_NBR) AS "<5",
  SUM(stats.RESPONSES_LESS_6_NBR + stats.RESPONSES_LESS_7_NBR + stats.RESPONSES_GREATER_7_NBR) AS ">5",
  SUM(stats.RESPONSES_LESS_6_NBR) AS "<6",
  SUM(stats.RESPONSES_LESS_7_NBR) AS "<7",
  SUM(stats.RESPONSES_GREATER_7_NBR) AS ">7",
  SUM(stats.RESPONSES_LESS_1_NBR + stats.RESPONSES_LESS_2_NBR + stats.RESPONSES_LESS_3_NBR + stats.RESPONSES_LESS_4_NBR + stats.RESPONSES_LESS_5_NBR + stats.RESPONSES_LESS_6_NBR + stats.RESPONSES_LESS_7_NBR + stats.RESPONSES_GREATER_7_NBR) as "Total"
FROM gwydb.statistics stats
WHERE stats.stat_date >= '01-JUN-2011'
GROUP BY stats.gds_id, TRUNC(stats.stat_date)