我有一個用于比較報表余額和支出記錄的查詢。
我想把它變成一個視圖,但是它使用了兩個變數,而你不能在一個視圖中使用這兩個變數。
我想到,應該可以使用通用表運算式(CTE,或 "WITH "查詢)來替換變數,這樣我就可以將其打包成一個視圖。
我讀到過,CTEs 可以作為一種命名的子查詢,然后可以在同一個查詢中重復使用。我一直在玩,試圖讓它發揮作用,但無法擺脫語法錯誤。
以下是我正在使用的帶有變數的代碼,但是如果有一個概念性的工具箱來以一般的方式做這件事,而不是簡單地解決我的問題,那就太好了! :-)
SELECT
sb.id,
帳戶。
acct_name(Account) AS `Name`,
-- acct_name() 是我寫的一個遞回CTE,用來顯示一個的名稱。
-- 層次化的賬戶名稱,如 "資產,流動資產,支票"。
`Begin`。
Begin_balance,
`End`。
End_balance,
sb.金額 `變化`。
@sss := COALESCE(
(SELECT SUM(Amount)
FROM sa_general_journal jg1
WHERE (sb.id IN(jg1.Statement_s, jg1.Statement_d)
AND sb.account = jg1.Source)。)
0) AS `Src`,
@ddd := COALESCE(
(SELECT SUM(Amount)
FROM sa_general_journal jg2
WHERE (sb.id IN(jg2.Statement_s, jg2.Statement_d)
AND sb.account = jg2.Destination)。)
0) AS `Dst`,
CONVERT(@ddd - @sss, DECIMAL (8,2) AS `Dest-Src`,
IF(CONVERT(@ddd - @sss - Sb. amount, DECIMAL (8,2) = 0,
NULL。
CONVERT(@ddd - @sss - Sb. amount, DECIMAL (8,2) ) AS `Error`。
FROM sa_statement_balances sb
LEFT JOIN sa_accounts a ON account = a.ID
# WHERE `Begin` >= '2020-07-01'
GROUP BY sb.id DESC
ORDER BY BEGIN
我試著替換了
@sss : = COALESCE(..., 0) as `Src`,
與
COALESCE(WITH sss AS (
SELECT SUM(Amount)
FROM sa_general_journal jg1
WHERE (sb.id IN(jg1.Statement_s, jg1.Statement_d)
AND sb.account = jg1.Source) SELECT * from sss>, 0) AS `Src`,
但是我所得到的是一個令人沮喪的語法錯誤。
對于用CTE替換變數的通用方法有什么想法嗎,尤其是能解決我的具體問題的方法?
謝謝!
uj5u.com熱心網友回復:
測驗
WITH cte AS (
SELECT sb.id。
帳戶。
acct_name(Account) AS `Name`,
`Begin`,
Begin_balance,
`End`,
End_balance,
sb.金額 `變化`。
COALESCE((SELECT SUM(Amount)
FROM sa_general_journal jg1
WHERE (sb.id IN(jg1.Statement_s, jg1.Statement_d)
AND sb.account = jg1.Source) ,0) AS `Src`,
COALESCE((SELECT SUM(Amount)
FROM sa_general_journal jg2
WHERE (sb.id IN(jg2.Statement_s, jg2.Statement_d)
AND sb.account = jg2.Destination),0) AS `Dst`,
sb.金額
FROM sa_statement_balances sb
LEFT JOIN sa_accounts a ON account = a.ID
# WHERE `Begin` >= '2020-07-01'
GROUP BY sb.idDESC
)
SELECT id,
帳戶。
`名稱',
`Begin`,
Begin_balance,
`End`,
End_balance,
變化"。
`Src',
`Dst',
CONVERT(`Dst` - `Src`, DECIMAL (8, 2) AS `Dest-Src`,
IF(CONVERT(`Dst` - `Src` - amount, DECIMAL (8,2) = 0,
NULL。
CONVERT(`Dst` - `Src` - amount, DECIMAL (8,2) ) AS `Error`。
FROM cte
ORDER BY `BEGIN`。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306791.html
標籤:
