2011-09-01 2 views
1

아래 요청에 문제가 있습니다!SQL/Coalesce - 잘못된 행 이름

요청 :

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;). GROUP BY ... WITH ROLLUP : 당신 쿼리

답변

1

문제는 마지막 줄에 (AN SQL 안티 패턴 암시 SQL의 89 조인을 사용하여 제외) 거의 정확합니다.
과정에서 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 
+1

그것은 작동합니다 : 당신이과 같이 쿼리를 다시 작성해야 함께 그래서 유착이 이미 시간 롤업으로 완료
온다! 설명 주셔서 대단히 감사합니다. BTW 나는 이런 종류의 암시 적 조인이 안티 패턴이므로 다시 한번 감사드립니다! 그게 많이 도움이됩니다;) –

관련 문제