mysql嵌套选择代码_关于mysql:嵌套联合选择语句
是否可以對我的sql SELECT語句的結果進行分組而不創建臨時表以對一條語句進行求和和分組? 我有一張表格,保存貸方帳戶號和借方帳戶號的借方和貸方總額。
并為相反的字段輸入零,我在下面的聯合選擇語句下進行了第一個分組,我需要根據重復的帳戶名稱對輸出求和
我可以很容易地獲得相同的結果,還是必須加載它的臨時表? 我的選擇聲明如下
select ?journal_drname ?AS ACCNAME, sum(amount) AS DEBT,0 as CREDIT
FROM JOURNAL GROUP BY journal_drname
UNION select ?journal_crname ?AS ACCNAME, 0 as DEBT,sum(amount) AS
CREDIT,
FROM JOURNAL GROUP BY journal_crname
返回數據,例如:
ACCNAME ? ? ?DEBIT ? ? CREDIT
-------- ? ------- ? ? ------
CASH ? ? ? ?0 ? ? ? ? ? 1,000
CASH ? ? ? ?900 ? ? ? ? ?0
CASH ? ? ? ?300 ? ? ? ? ?0
BANK ? ? ? ?200 ? ? ? ? ?0
BANK ? ? ? ?400 ? ? ? ? ?0
我可以在上方總結以下幾項:
ACCNAME ? ? ?DEBIT ? ? CREDIT
-------- ? ------- ? ? ------
CASH ? ? ? ?200 ? ? ? ? ?0
BANK ? ? ? ?600 ? ? ? ? ?0
我想將這些結果與上述相同。
我試圖避免使用臨時表,但是如果這是唯一可行的方法,那么我想了解更多有關以這種方式使用臨時表的信息。
我也嘗試進行某種形式的聯接和聯合,但不滿足條件,而且我也不知道該怎么做。
除非journal_drname中包含不尋常的字符,否則您的結果沒有意義。
改寫:每個現金名稱和現金的貸方和借項值分別為0怎么辦? 您提出的SQL否定了這種可能性。
是的,我有兩種情況下的帳戶名有時會記入貸方,在這種情況下,我必須將帳戶名加載到journal_crname中,如果借記了相同的帳戶名,則必須將其加載到journal_crname字段中,因此我在外部帳戶名中加載了兩列 journal_drname和journal_crname
正如您所說的,查詢工作正常,讓我們將聯合查詢稱為表格
( ...... ) myTable
然后只需創建一個子查詢即可獲得最后一步
SELECT ACCNAME,
CASE WHEN SUM(CREDIT - DEBT) < 0 THEN - SUM(CREDIT - DEBT)
ELSE 0
END DEBT,
CASE WHEN SUM(CREDIT - DEBT) > 0 THEN ? SUM(CREDIT - DEBT)
ELSE 0
END CREDIT
FROM ( ...... ) myTable
GROUP BY ACCNAME
該語句看起來很完美,但仍然給我錯誤消息,不接受最后一行" GROUP BY ACCNAME",我將繼續檢查并恢復thxs
是的,現在工作量增加了三倍
您發現錯誤了嗎?
是的,我錯過了將內部表別名myTable放的原因,這就是為什么。
如果每個子查詢只需要一行,則刪除group by:
select ?'CASH' as ACCNAME, sum(amount) AS DEBT, 0 as CREDIT
FROM JOURNAL
UNION ALL
select ?'BANK' as ACCNAME, 0 as DEBT, sum(amount) AS ?CREDIT
FROM JOURNAL;
(注意:ACCNAME值可能相反。)
要點:對于這種類型的查詢,應該使用UNION ALL而不是UNION。 除非您打算刪除重復項,否則沒有理由承擔刪除重復項的開銷。
另外,除非accname字段中有不尋常的字符,否則您的原始查詢應該已經起作用。
我喜歡它...但是我對",除非您打算刪除重復項"感到困惑,根據定義,不能有重復項。 基于SQL。 CASH和BANK否定聯合中的重復項,并且在內部,由于每行只有一行,因此不能有重復項。 也許您需要在聯合的每個部分中的journal_drname的where子句,對于銀行的一個子句,對于現金的子句。
@xQbert。。。 即使沒有重復項,UNION總是會產生刪除重復項的開銷(我說"總是";但是我想某個地方的某些數據庫可能會識別出某些短路重復項消除的特殊情況)。
關于什么:
select ACCNAME,
CASE WHEN sum(DEBT)>sum(CREDIT) THEN sum(DEBT)-sum(CREDIT) ELSE 0 AS DEBT,
CASE WHEN sum(DEBT)
FROM (
select ?journal_drname ?AS ACCNAME,
sum(amount) AS DEBT,
0 as CREDIT
FROM JOURNAL GROUP BY journal_drname
UNION
select journal_crname ?AS ACCNAME,
0 as DEBT,
sum(amount) AS CREDIT,
FROM JOURNAL GROUP BY journal_crname
) group by ACCNAME
我相信mySql子查詢必須具有別名才能工作。
總結
以上是生活随笔為你收集整理的mysql嵌套选择代码_关于mysql:嵌套联合选择语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中写色块,CSS3 彩虹色块
- 下一篇: mysql耦合_内聚与耦合