1

以下のリクエストに問題があります!

リクエスト:

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

問題は、リクエストが正常に機能していることです(正しい数値)が、最後の行で最初の行「合計」を取得することが期待され、その代わりにフィールドNULLを取得しました...

誰かが私のリクエストの何が問題なのか知っていますか?助けのためのThx;)。

4

1 に答える 1

1

あなたのクエリはほぼ正しいです(SQLアンチパターンである暗黙のSQL '89結合を使用する場合を除く)

問題は最後の行にあります: GROUP BY ... WITH ROLLUP.
ロールアップは、プロセスの非常に遅い段階で適用されますCOALESCE(date(date_field), 'Total')
したがって、ロールアップが行われるまでに合体はすでに終了しているため、クエリを次のように書き直す必要があります。

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
于 2011-09-01T10:11:03.677 に答える