簡體   English   中英

多個 INNER JOIN 上的 SQL SUM

[英]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結合BalanceLoan表並使用一點技巧,

  • Balance填寫Loan欄設置 0
  • Loan填寫Balance列設置 0

然后JOINStateSUM

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM