[英]SQL SUM on multiple INNER JOIN
我正在嘗試使用連接通過多個表獲取特定字段的總和。 當我嘗試將這些值放在一起時,我弄錯了 SUM。
我有表狀態
| STATE | MONTH | ID | TOTAL |
--------------------------------
| FL | July | 1 | 10000 |
| CA | April | 32 | 2000 |
我有另一張表余額為
| STATE | Balance|
-------------------
| FL | 100|
| FL | 200|
| CA | 300|
| CA | 200|
| CA | 100|
我還有一張桌子貸款
| STATE | Loan|
-------------------
| FL | 500|
| FL | 600|
| CA | 700|
| CA | 100|
| CA | 200|
作為查詢的結果,我想要的是,
| STATE | Loan| Balance|
----------------------------
| FL | 1100| 300|
| CA | 1000| 600|
當我嘗試使用以下查詢時,我正確地獲得了帶有狀態的貸款總和,
SELECT
S.STATE,
SUM(L.Loan)
FROM State AS S
INNER JOIN Loan AS L ON L.STATE = S.STATE
GROUP BY
S.STATE
我得到以下結果,
| STATE | Loan|
--------------------
| FL | 1100|
| CA | 1000|
同樣,我可以從余額表中得到總和。 我想要實現的是使用單個事務從兩個表中獲取總和。
雖然,我能夠得到想要的值,但如果我做這樣的事情,
SELECT
STATE AS STATE
SUM(DataSetB.Balance) AS Balance
FROM
(
SELECT
STATE AS STATE,
B.Balance AS Balance
FROM
(
SELECT
S.STATE AS STATE,
SUM(L.Loan) AS Loan,
FROM State AS S
INNER JOIN Loan AS L ON L.STATE = S.STATE
GROUP BY S.STATE
)
AS DataSetL
INNER JOIN Balance AS B ON B.STATE = DataSetL.STATE
GROUP BY
DataSetL.STATE, B.Balance
) AS DataSetB
GROUP BY
DataSetB.STATE
然而,這在我擁有的大型數據集上不太可行。 我試過了,
SELECT
S.STATE AS STATE,
SUM(L.Loan) AS Loan,
SUM(B.Balance) AS Balance
FROM State AS S
INNER JOIN Loan AS L ON L.STATE = S.STATE
INNER JOIN Balance AS B ON B.STATE = S.STATE
GROUP BY
S.STATE
但這給了我實際值的倍數。 它實際上是子表中存在的行數的倍數。
我不是要求一個確切的解決方案,但任何類型的指針都會很好。
你可以試試這個,使用UNION ALL
結合Balance
和Loan
表並使用一點技巧,
Balance
填寫Loan
欄設置 0Loan
填寫Balance
列設置 0 然后JOIN
與State
做SUM
create table State(
STATE varchar(50)
);
insert into State values ('FL');
insert into State values ('CA');
create table Balance(
STATE varchar(50),
Balance int
);
insert into Balance values ('FL',100);
insert into Balance values ('FL',200);
insert into Balance values ('CA',300);
insert into Balance values ('CA',200);
insert into Balance values ('CA',100);
create table Loan(
STATE varchar(50),
loan int
);
insert into loan values ( 'FL',500);
insert into loan values ( 'FL',600);
insert into loan values ( 'CA',700);
insert into loan values ( 'CA',100);
insert into loan values ( 'CA',200);
查詢 1 :
SELECT s.STATE,SUM(t1.Loan) as 'Loan',SUM(t1.Balance) as 'Balance'
FROM
(
SELECT STATE,0 AS Loan,Balance
FROM Balance
UNION ALL
SELECT STATE,Loan,0
FROM Loan
) t1
INNER JOIN State s on s.STATE = t1.STATE
GROUP BY s.STATE
結果:
| STATE | Loan | Balance |
|-------|------|---------|
| CA | 1000 | 600 |
| FL | 1100 | 300 |
在單獨的子查詢中對每個表進行聚合,然后加入:
SELECT
S.STATE AS STATE,
L.Loan,
B.Balance
FROM State AS S
LEFT JOIN (select state, sum(loan) as Loan
from loan
group by state) AS L ON L.STATE = S.STATE
LEFT JOIN (select state, sum(Balance) as balance
from balance
group by state) AS B ON B.STATE = S.STATE
(左連接,以防一個狀態沒有貸款或余額行。)
嘗試這個:
SELECT S.STATE, L.Loan as TotalLoan, B.Balance as TotalBalance
FROM State AS S
LEFT JOIN (select STATE, sum(Loan) as Loan
from Loan
group by STATE) AS L
ON L.STATE = S.STATE
LEFT JOIN (select STATE, sum(Balance) as Balance
from Balance
group by STATE) AS B
ON B.STATE = S.STATE
結果是:
| STATE |TotalLoan|TotalBalance|
----------------------------
| FL | 1100 | 300 |
| CA | 1000 | 600 |
你可以試試這個:
Select S.State, B.Balance,L.Loan from State S
inner join (select state, sum(loan) as Loan from Loan group by state) L
inner join (select state, sum(balance) as Balance from Balance group by state) B
on L.state=S.state and B.State=S.State;
使用子查詢:首先連接貸款和余額表,然后將狀態表與派生表結果連接起來
SELECT
S.STATE AS STATE, Loan,Balance
FROM State AS S inner join
(select L.state,sum(loan) as loan, sum(balance) as balance
from Loan AS L INNER JOIN Balance AS B ON B.STATE = S.STATE
GROUP BY L.STATE)X on s.state=x.state
我建議使用公用表表達式,因為它讀起來很“干凈”。
嘗試以下操作:
WITH CTE_TotalLoan AS (
SELECT
State,
SUM(Loan) AS TotalLoan
FROM Loan
GROUP BY State
),
CTE_TotalBalance AS (
SELECT
State,
SUM(Balance) AS TotalBalance
FROM Balance
GROUP BY State
)
SELECT
S.State,
TotalLoan,
TotalBalance
FROM State AS S
INNER JOIN CTE_TotalLoan AS L ON L.STATE = S.STATE
INNER JOIN CTE_TotalBalance AS B ON B.STATE = S.STATE
請參閱工作 SQL Fiddle 。
嘗試這個:
Create Table #Loan([State] Varchar(10),Loan Bigint)
Create Table #Balance([State] Varchar(10),Balance Bigint)
Insert Into #Loan
Select 'FL',500 Union All
Select 'FL',600 Union All
Select 'CA',700 Union All
Select 'CA',100 Union All
Select 'CA',200
Insert Into #Balance
Select 'FL',100 Union All
Select 'FL',200 Union All
Select 'CA',300 Union All
Select 'CA',200 Union All
Select 'CA',100
;with cteLoan
AS(
Select ROW_NUMBER() Over(Partition by State order by State) As Rn, * from #Loan
)
,
cteBalance
AS(
Select ROW_NUMBER() Over(Partition by State order by State) As Rn, * from #Balance
)
Select DISTINCT ISNULL(l.State,b.State) as State
,SUM(ISNULL(Loan,0)) As Loan
,SUM(ISNULL(Balance,0)) As Balance
from cteLoan l
FULL OUTER JOIN cteBalance b
on l.State=b.State and l.rn=b.rn
Group by ISNULL(l.State,b.State)
Drop Table #Loan
Drop Table #Balance
您也可以使用APPLY
:
SELECT s.*, l.loan, b.balance
FROM State s OUTER APPLY
(SELECT SUM(l.loan) loan
FROM loan l
WHERE l.state = s.state
) l OUTER APPLY
(SELECT SUM(b.balance) balance
FROM balance b
WHERE b.state = s.state
) b;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.