SQL / Coalesce - 错误的行名称

时间:2011-09-01 09:37:08

标签: mysql sql coalesce

我在下面的请求中遇到了问题!

REQUEST:

SELECT COALESCE(date(date_field), 'Total') AS "date_field_group",
COUNT( id_field ) AS  "Nombre de bookings",
CONCAT( REPLACE( REPLACE( FORMAT( SUM( price1 ) , 2 ) , ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  "Total à l'achat",
CONCAT( REPLACE( REPLACE( FORMAT( SUM( price2 ) , 2 ) ,  ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  "Total à la vente",
CONCAT( REPLACE( REPLACE( FORMAT( SUM( price2 ) - SUM( price1 ) , 2 ) ,  ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  'Marge',
CONCAT( REPLACE( FORMAT( (SUM( price2 ) / SUM( price1 ) ) , 2 ) ,  '1.',  '' ) ,  ' ',  '%') AS  "Markup moyen"
FROM table1 S, table2 B
WHERE status_field
IN ( "1",  "5")
AND DATE( date_field ) BETWEEN  "2011-08-01" AND  "2011-08-31"
AND type_field =  "H"
AND price1 IS NOT NULL 
AND S.id_field = B.id_field
AND B.id2 =  "1"
GROUP BY date_field_group WITH ROLLUP

问题是请求工作正常(正确的数字),但在最后一行我应该进入第一行" Total"而不是我有一个字段NULL ...

有人知道我的请求有什么问题吗? 感谢任何帮助;)。

1 个答案:

答案 0 :(得分:1)

你的查询几乎是正确的(除了使用隐式SQL '89连接,这是一种SQL反模式)

问题出在最后一行:GROUP BY ... WITH ROLLUPCOALESCE(date(date_field), 'Total')之后,汇总在此过程中很晚 所以coalesce已经完成了累积时间,你需要像这样重写查询:

SELECT COALESCE(date_field_group, 'Total') as date_field_group
  , `Nombre de bookings`
  , `Total à l'achat`
  , `Total à la vente`
  , `Marge`
  , `Markup moyen`
FROM (
   SELECT date(date_field) AS "date_field_group",   
     COUNT( id_field ) AS  "Nombre de bookings",   
     CONCAT( REPLACE( REPLACE( FORMAT( SUM( price1 ) , 2 ) , ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  "Total à l'achat",   
     CONCAT( REPLACE( REPLACE( FORMAT( SUM( price2 ) , 2 ) ,  ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  "Total à la vente",   
    CONCAT( REPLACE( REPLACE( FORMAT( SUM( price2 ) - SUM( price1 ) , 2 ) ,  ',',  ' ' ) ,  '.',  ',' ) ,  ' €' ) AS  'Marge',   
    CONCAT( REPLACE( FORMAT( (SUM( price2 ) / SUM( price1 ) ) , 2 ) ,  '1.',  '' ) ,  ' ',  '%') AS  "Markup moyen"   
  FROM table1 S
  INNER JOIN table2 B ON (S.id_field = B.id_field)   
  WHERE status_field IN ( "1",  "5")   
    AND DATE( date_field ) BETWEEN  "2011-08-01" AND  "2011-08-31"   
    AND type_field =  "H"   
    AND price1 IS NOT NULL    
    AND B.id2 =  "1"   
  GROUP BY date_field_group WITH ROLLUP ) AS subquery