如何使用join获取带有SQL查询的所有条目

时间:2017-02-01 10:38:54

标签: mysql sql join

KON

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服务器。 有可能解决这个问题吗?

6 个答案:

答案 0 :(得分:2)

Where替换为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

答案 1 :(得分: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
  

OutPut:

enter image description here

答案 2 :(得分: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

答案 3 :(得分:0)

通常," ticket.package IS NOT NULL"是错误的条件:您的查询从左连接变为内连接。如果ticket.package应该是非NULL来从金额添加,它应该不是条件,而是在SUM agregate函数内。

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

Bhosale先生的答案也是对的,但对于大牌桌会有更差的表现(原因是子查询)

答案 4 :(得分: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

答案 5 :(得分: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