【问题标题】:BAD FIELD ERROR in WHERE DATE CLAUSE for MySQLMySQL 的 WHERE DATE CLAUSE 中的错误字段错误
【发布时间】:2018-09-13 06:24:41
【问题描述】:

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

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

【问题讨论】:

  • 在您的问题中包含错误消息可能会有所帮助。
  • 检查您的陈述,您将列定义为Data,但在您的案例陈述中寻找data
  • 我尝试将Data 更改为data,但没有成功。当我在 WHERE 子句中公开任何类型的 DATE RANGE 时,我会收到此错误:ER_BAD_FIELD_ERROR: Unknown column 'arrPurch.PurchaseDate' in 'where clause'。我不明白为什么我可以将确切的 DATE 子句放在其他查询中,但是在这个查询中,它会产生错误。

标签: mysql date where between


【解决方案1】:

我找到了答案。我将 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多