这是MySQL表的一部分
Amount | DebitAccount | RecordYear | RecordMonth | RecordDay
在MySQL查询中,需要RecordYear,RecordMonth,RecordDay
更改为DATE
。
基于许多建议获得这样的工作代码(我将代码仅显示为以查看其工作原理)
SELECT * FROM
(SELECT *
, CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
FROM 2_1_journal) DATA
WHERE RecordDate <> ? AND DocumentDate = ?
ORDER BY RecordDate DESC
此代码从表中选择所有内容,将分隔的整数更改/转换为RecordDate
,并根据WHERE
为我提供数据。
以下是第二个工作代码也仅作为示例
SELECT a.AccountNumber,
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount
FROM 18_7_ChartOfAccounts AS a
LEFT JOIN (
SELECT DebitAccount,
SUM( Amount ) AS Amount FROM 2_1_journal WHERE
CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED) != ? AND CAST(RecordYear AS UNSIGNED) != ?
GROUP BY DebitAccount
) d ON (a.AccountNumber = d.DebitAccount)
需要第二个代码的CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED) != ? AND CAST(RecordYear AS UNSIGNED) != ?
部分
更改为第一个代码的, CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
部分。
我创建了这样的代码
SELECT a.AccountNumber,
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount
FROM 18_7_ChartOfAccounts AS a
LEFT JOIN (
SELECT DebitAccount,
SUM( Amount ) AS Amount ,
CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
FROM 2_1_journal
WHERE RecordDate = ?
GROUP BY DebitAccount
) d ON (a.AccountNumber = d.DebitAccount)
/*below code is for purpose to show whole code*/
LEFT JOIN ( SELECT CreditAccount, SUM( Amount ) AS Amount , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal WHERE RecordDate = ? GROUP BY CreditAccount ) c ON (a.AccountNumber = c.CreditAccount)
在输出中获取此错误SQLSTATE[42S22]: Column not found: 1054 Unknown column 'RecordDate' in 'where clause'
理解CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
必须位于其他地方。但是什么地方?可能需要像第一个示例中那样添加DATA
。
代码可能看起来不易理解,但这样的代码可以获得必要的代码。 请指教。
更新
基于建议更改代码
SELECT
a.AccountNumber,
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount
FROM 18_7_ChartOfAccounts AS a
LEFT JOIN (
SELECT * FROM (
SELECT DebitAccount,
SUM( Amount ) AS Amount ,
CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate,
CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
FROM 2_1_journal) DATA
WHERE RecordDate = 2013-01-20
GROUP BY DebitAccount
) d ON (a.AccountNumber = d.DebitAccount)
我知道表中的行是日期2013-01-20。但是在输出结果为0且没有错误。
可能是我在代码中的疏忽错误....
得出结论,代码只在MySQL表的第一行检查日期。如果第一行日期与用户输入匹配,则代码会对列Amount
中的所有值求和。如果不匹配,则结果为0.
更新1
似乎最终这是有效的代码。目前的输出是预期的。如果可能,请提出改进建议
SELECT
a.AccountNumber,
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount
FROM 18_7_ChartOfAccounts AS a
LEFT JOIN (
SELECT DebitAccount,
SUM( Amount ) AS Amount FROM
( SELECT * , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal) DATA
WHERE
RecordDate = ?
GROUP BY DebitAccount
) d ON (a.AccountNumber = d.DebitAccount)
LEFT JOIN (
SELECT CreditAccount,
SUM( Amount ) AS Amount FROM
( SELECT * , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal) DATA
WHERE
RecordDate = ?
GROUP BY CreditAccount
) c ON (a.AccountNumber = c.CreditAccount)
答案 0 :(得分:3)
您不能只使用CAST
,还缺少第一个示例中的SELECT
嵌套。没有它,您无法在WHERE
;
SELECT DebitAccount,
SUM( Amount ) AS Amount ,
CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate ,
CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
FROM 2_1_journal
WHERE RecordDate = ?
GROUP BY DebitAccount
......需要......
SELECT * FROM (
SELECT DebitAccount,
SUM( Amount ) AS Amount ,
CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate,
CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate
FROM 2_1_journal) DATA
WHERE RecordDate = ?
GROUP BY DebitAccount
也就是说,此查询的性能不易维护,您在计算字段上执行WHERE
,这必然需要计算表中所有行的值< / em>每次执行查询。在表格中有一个实际的DATE
字段可以加快速度。