MySQL的日期条件中的坏字段错误

时间:2018-04-03 20:07:55

标签: mysql date where between

为什么我使用以下代码收到错误:

SELECT
Hour, 
SUM( CASE col WHEN '1' THEN data ELSE 0 END ) AS 'Sun', 
SUM( CASE col WHEN '2' THEN data ELSE 0 END ) AS 'Mon', 
SUM( CASE col WHEN '3' THEN data ELSE 0 END ) AS 'Tues', 
SUM( CASE col WHEN '4' THEN data ELSE 0 END ) AS 'Wed',     
SUM( CASE col WHEN '5' THEN data ELSE 0 END ) AS 'Thur',     
SUM( CASE col WHEN '6' THEN data ELSE 0 END ) AS 'Fri',     
SUM( CASE col WHEN '7' THEN data ELSE 0 END ) AS 'Sat'
FROM    (
        SELECT
            HOUR(arrPurch.PurchaseDate) as HOUR,
            DAYOFWEEK(arrPurch.PurchaseDate) as col,
            SUM(ROUND(arrPurch.Credits * 1.85 + arrPurch.Price,0)) AS Data
        FROM praisecharts_main_new.arrangementPurchases AS arrPurch
        INNER JOIN praisecharts_main_new.catalog_dev_arrangements 
            AS catDEVarr ON arrPurch.ArrangementID = catDEVarr.ArrangementID
        INNER JOIN praisecharts_main_new.members 
            ON arrPurch.MemberID = members.MemberID
        GROUP BY HOUR(arrPurch.PurchaseDate), DAYOFWEEK(arrPurch.PurchaseDate)
        ) AS stats 
WHERE 
    Hour BETWEEN 0 AND 23 
    --      AND arrPurch.PurchaseDate BETWEEN (CURDATE() - INTERVAL 29 DAY) 
    --      AND (CURDATE() - INTERVAL 1 DAY)
    --      AND arrPurch.PurchaseDate > (CURDATE() - INTERVAL 1 DAY)
GROUP BY Hour WITH ROLLUP 

当我不尝试使用CASE条款对结果进行PIVOT时,我不会收到错误。以下是有效查询的示例:

SELECT
DAYOFWEEK(arrPurch.PurchaseDate) AS DayWeek,
FORMAT(SUM(arrPurch.Credits*1.85+arrPurch.Price)/4,0) AS `c.Rev`
FROM
    praisecharts_main_new.arrangementPurchases AS arrPurch
INNER JOIN praisecharts_main_new.catalog_dev_arrangements AS catDEVarr ON 
    arrPurch.ArrangementID = catDEVarr.ArrangementID
INNER JOIN praisecharts_main_new.members 
    ON arrPurch.MemberID = members.MemberID
WHERE arrPurch.PurchaseDate BETWEEN (CURDATE() - INTERVAL 29 DAY) 
    AND (CURDATE() - INTERVAL 1 DAY)
GROUP BY DayWeek WITH ROLLUP;
LIMIT 14

1 个答案:

答案 0 :(得分:0)

我能找到答案。我将WHERE子句移动到上面嵌入的SELECT原因,而不是底部。以下是有效代码的示例。

SELECT
Hour, 
SUM( CASE col WHEN '1' THEN data ELSE 0 END ) AS 'Sun', 
SUM( CASE col WHEN '2' THEN data ELSE 0 END ) AS 'Mon', 
SUM( CASE col WHEN '3' THEN data ELSE 0 END ) AS 'Tues', 
SUM( CASE col WHEN '4' THEN data ELSE 0 END ) AS 'Wed',     
SUM( CASE col WHEN '5' THEN data ELSE 0 END ) AS 'Thur',     
SUM( CASE col WHEN '6' THEN data ELSE 0 END ) AS 'Fri',     
SUM( CASE col WHEN '7' THEN data ELSE 0 END ) AS 'Sat'
FROM    (
        SELECT
            HOUR(arrPurch.PurchaseDate) as HOUR,
            DAYOFWEEK(arrPurch.PurchaseDate) as col,
            SUM(ROUND((arrPurch.Credits * 1.85 + arrPurch.Price)/4,0)) AS data
        FROM praisecharts_main_new.arrangementPurchases AS arrPurch
        INNER JOIN praisecharts_main_new.catalog_dev_arrangements 
            AS catDEVarr ON arrPurch.ArrangementID = catDEVarr.ArrangementID
        INNER JOIN praisecharts_main_new.members 
            ON arrPurch.MemberID = members.MemberID

        WHERE arrPurch.PurchaseDate BETWEEN (CURDATE() - INTERVAL 29 DAY) 
             AND (CURDATE() - INTERVAL 1 DAY)

        GROUP BY HOUR(arrPurch.PurchaseDate), 
            DAYOFWEEK(arrPurch.PurchaseDate)
    ) AS stats 
WHERE 
    Hour BETWEEN 0 AND 23 
GROUP BY Hour WITH ROLLUP