RE: Bug in GROUP BY/CASE/MAX? More info -- it seems that if I change the 'NULL' to '' (i.e. the empty string) in the CASE statements, I get the result I'm looking for. That is, the query:
mysql> select max(case when col = 1 then val else '' end) as color from t group by row; returns the three rows 'orange', 'yellow', and 'green'. Why is that? Is something broken when MySQL calculates the aggregate for a column that contains a NULL value? Is there a doc to explain how an aggregate function should work in the presence of NULL? Bob Diss, [EMAIL PROTECTED] =================================================================== >Date: Tue, 10 Dec 02 13:57:00 EST >From: "'Bob Diss'" <[EMAIL PROTECTED]> >To: "'MySQL List'" <[EMAIL PROTECTED]> > >Bug in GROUP BY/CASE/MAX? > >I'm seeing a strange result when I group rows and using CASE and >MAX() to select the column I'm interested in (typical pivot-table >operation). Here's my sample case: > >mysql> -- create table >mysql> create table t (row int not null, > col int not null, > val varchar(255) not null); > >mysql> -- populate with test records >mysql> insert into t values (1,1,'orange'); >mysql> insert into t values (1,2,'large'); >mysql> insert into t values (2,1,'yellow'); >mysql> insert into t values (2,2,'medium'); >mysql> insert into t values (3,1,'green'); >mysql> insert into t values (3,2,'small'); > >mysql> -- group by row, extract values where col=1 >mysql> select max(case when col = 1 then val else null end) as color > from t group by row; > >MySQL shows the result set as: > >+--------+ >| color | >+--------+ >| orange | >| NULL | >| NULL | >+--------+ >3 rows in set (0.00 sec) > >I would have expected MySQL to group the records into >three sets according to row: > (1,1,'orange') > (1,2,'large') > > (2,1,'yellow') > (2,2,'medium') > > (3,1,'green') > (3,2,'small') > >then, for each set, apply the case expression: > (1,1,'orange') becomes 'orange' > (1,2,'large') becomes NULL > > (2,1,'yellow') becomes 'yellow' > (2,2,'medium') becomes NULL > > (3,1,'green') becomes 'green' > (3,2,'small') becomes NULL > >then, apply the max() aggregate: > max('orange',NULL) becomes 'orange' > max('yellow',NULL) becomes 'yellow' > max('green',NULL) becomes 'green' > >So, I'm expecting to see a result set of three colors. This query >works as I expect in MS-SQLServer 7.0. Why doesn't it work the same >way in MySQL? > >I'm running the RPMS from MySQL.com for MySQL-max 3.23.52 >on RedHat 7.3. > >tia, > >Bob Diss, [EMAIL PROTECTED] > >--------------------------------------------------------------------- >Before posting, please check: > http://www.mysql.com/manual.php (the manual) > http://lists.mysql.com/ (the list archive) > >To request this thread, e-mail <[EMAIL PROTECTED]> >To unsubscribe, e-mail <[EMAIL PROTECTED]> >Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php > --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php