1

これは 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ます。

これも例としてのみ2番目の作業コードです

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) != ?2番目のコードのこの部分が必要です

, 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 テーブルの最初の行でのみ日付をチェックするという結論に達しました。最初の行の日付がユーザーの入力と一致する場合、コードは column のすべての値を合計します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)
4

1 に答える 1

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の値を計算する必要があります。テーブルに実際のフィールドがあると、処理がかなり高速になります。DATE

于 2013-07-05T06:58:57.360 に答える