2017-02-01 46 views
0

KON如何獲得與SQL查詢中的所有條目與加盟

id | name 
1 alex 
2 peter 
3 john 

id | amount | kon_id | package 
122 13  1  234 
123 12  1  234 
124 20  2  NULL 
125 23  2  235 
126 19  1  236 

我想獲得同量的總和所有聯繫人的名單,除了門票,其中包條目是NULL。 我的問題是,由於WHERE子句,我只得到有票的聯繫人。

SELECT 
    kon.id, 
    kon.name, 
    SUM(ticket.amount) 
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id 
WHERE ticket.package IS NOT NULL 
GROUP BY kon.id 

目前,輸出看起來像這樣

1 alex 44 
2 peter 23 

,但它應該是這樣的

1 alex 44 
3 john NULL 
2 peter 23 

我使用MySQL服務器。 可以解決這個問題嗎?

+0

預期產量是多少?當您執行上述查詢時,您目前得到什麼?另外,你正在使用哪些DBMS? – GurV

回答

0

選中此項。

 SELECT 
     k.id, 
     k.name , 
     coalesce (SUM(t.amount) ,0) 
     FROM kon k LEFT JOIN 
     (select id,amount,kon_id,package from ticket where package is not null) t 
     ON k.id = t.kon_id 
     GROUP BY k.id, k.name 

輸出:

enter image description here

2

AND

SELECT 
    kon.id, 
    kon.name, 
    SUM(ticket.amount) 
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id AND ticket.package IS NOT NULL 
GROUP BY kon.id 
0
Begin Tran 
Create Table #Kon (id INt , name Nvarchar(255)) 
Insert into #Kon 
Select 1,'alex' UNION ALL 
Select 2,'peter' UNION ALL 
Select 3,'john' 


Create Table #Ticket (id int,amount int,Kon_Id Int,Package Int) 

INSERT INTO #Ticket 
SELECT 122,13,1,234 UNION ALL 
SELECT 123,12,1,234 UNION ALL 
SELECT 124,20,2,NULL UNION ALL 
SELECT 125,23,2,235 UNION ALL 
SELECT 126,19,1,236 


SELECT K.id, Name,SUM(amount) amount 
FROM #Kon k 
LEFT JOIN #Ticket T ON K.id=T.Kon_Id 
GROUP BY K.id,Name 

RollBAck Tran 
+0

按以上提及輸出檢查此查詢 –

0

一般情況下,「票替換Where .package IS NOT NULL「是錯誤的條件:您的查詢從左連接變爲內連接。如果ticket.package應該不是從NULL添加的,它應該不在條件中,而是在SUM agregate函數中。

工作示例從Bhosale先生MS SQL

SELECT 
    kon.id, 
    min(kon.name), 
    SUM(case when package is NULL then 0 else ticket.amount end) 
FROM @kon kon LEFT JOIN @ticket ticket ON kon.id = ticket.kon_id 
GROUP BY kon.id 

答案是正確的太多,但對於大表將有更差的性能(原因是子查詢)

+0

謝謝!你的代碼是最快的,但它仍然需要3秒左右。我認爲將內部連接查詢(0.2154秒)結果與簡單的kon查詢(0.0015秒)結果相結合會更快。 –

0

下面的查詢返回您預期的結果

SELECT 
kon.id, 
kon.name, 
SUM(ticket.amount) as 'amount' 
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id 
GROUP BY kon.id, kon.name 

附加的圖像示出了結果

enter image description here

0

我想出瞭解決問題的最快方法。與其他解決方案(2s - 2min)相比大約需要0.2s。 CAST很重要,否則雙重變量的總和是錯誤的(浮點串問題)。

SELECT 
    kon1, 
    kon2, 
    SUM(CAST(kon3 AS DECIMAL(7,2))) 
FROM (
    SELECT k.id kon1, k.name kon2, t.amount kon3 FROM kon as k 
    LEFT JOIN ticket t ON k.id = t.ticket_kon 
WHERE t.package IS NOT NULL 
UNION ALL 
    SELECT k.id kon1, k.name kon2, NULL kon3 FROM kon k WHERE) t1 
GROUP BY kon1, kon2