开发者

Group By isn't grouping properly

I'm working with oracle and it's group by clause seems to behave very differently than I'd expect.

When using this query:

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

I get results like this:

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    开发者_Python百科132 13  6   0   8   0   2   6   1306
1A      01-JUN-11   91          2331    114 14  5   1   14  3   1   10  2479

As you can see, I have multiple duplicate STAT_DATE's per GDS_ID. Why is that, and how can I make it group by both of those? I.E. Sum the values for each GDS_ID per STAT_DATE.


Probably because STAT_DATE has a time component, which is being taken into account in the GROUP BY but not being displayed in the results due to the default format mask. To ignore the time, do this:

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)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜