2015-01-21 126 views
1

我有什么:Mysql的嵌套查询,1桌,3个查询,个人成绩

2表

- table_benefactor (id and benefactor names) 
- table_realstate (house adress, rent, paidrent flag) 

If paidrent = 0 (unpaid) 
If paidrent = 1 (paid) 

我需要什么:

1嵌套查询,返回我像下面的结果

name | totalrent | paid | unpaid 
_________________________________ 
Jhon | 1,000.00 |100.00| 900.00 
Doe | 2,500.00 |500.00| 2,000.00 
Chris| 800.00 |0.00 | 800.00 

我曾尝试:

我尝试过很多方法,但他们非给我的结果,我所需要的,他们得到接近,但不是我所需要的,这是我的查询 - >

如果我这样做这样它会正是我想要的,但不能退货的方式,我需要它

(SELECT table_realstate.benefactor, name, SUM(rent) totalrent 
FROM table_realstate, table_benefactor 
WHERE flag = 0 
AND table_realstate.benefactor = table_benefactor.id 
GROUP BY benefactor 
ORDER BY name ASC) 
UNION ALL 
(SELECT table_realstate.benefactor, name, SUM(rent) unpaid 
FROM table_realstate, table_benefactor 
WHERE flag = 0 
AND table_realstate.benefactor = table_benefactor.id 
AND table_realstate.paidrent = 0 
GROUP BY benefactor 
ORDER BY name ASC) 
UNION ALL 
(SELECT table_realstate.benefactor, name, SUM(rent) paid 
FROM table_realstate, table_benefactor 
WHERE flag = 0 AND table_realstate.benefactor = table_benefactor.id 
AND table_realstate.paidrent = 1 
GROUP BY benefactor 
ORDER BY name ASC) 

结果:

name | totalrent 
_________________ 
Jhon | 1,000.00 
Doe | 2,500.00 
Chris| 800.00  
Jhon | 100.00 
Doe | 500.00 
Jhon | 900.00 
Doe | 2,000.00 
Chris| 800.00 

所以我有一直在努力这样的事情:

如果我不喜欢这样的结果的结构是什么,我需要,但数学和恩人的名字出来的错误 - >

SELECT table_benefactor.name, SUM(rent) totalrent, SUM(rent) unpaid, SUM(rent) paid 
    FROM table_realstate, table_benefactor, 
    (SELECT table_realstate.benefactor, name, SUM(rent) totalrent 
    FROM table_realstate, table_benefactor 
    WHERE flag = 0 
    AND table_realstate.benefactor = table_benefactor.id 
    UNION ALL 
    SELECT table_realstate.benefactor, name, SUM(rent) unpaid 
    FROM table_realstate, table_benefactor 
    WHERE flag = 0 
    AND table_realstate.benefactor = table_benefactor.id 
    AND table_realstate.paidrent = 0 
    UNION ALL 
    SELECT table_realstate.benefactor, name, SUM(rent) paid 
    FROM table_realstate, table_benefactor 
    WHERE flag = 0 AND table_realstate.benefactor = table_benefactor.id 
    AND table_realstate.paidrent = 1) abc 
GROUP BY table_realstate.benefactor 

结果:

name | totalrent | paid | unpaid 
_________________________________ 
Jhon | 119.200 |119.200 | 119.200 
Jhon | 1,800.02 |1,800.02 | 1,800.02 
Jhon | 29,1964.2 |29,1964.2| 29,1964.2 
Jhon | 27,000.00 |27,000.00| 27,000.00 

你可以看到恩人的名字重复自己,值都遍布在这个地方。

我试过其他的东西,但不想让帖子比已经存在的时间长。

回答

0

我想你只是想条件聚合。如果paidrent标志只取值0和1,如代码所示,则这特别简单:

select b.name, sum(re.rent) as total_rent, 
     sum(re.rent * re.paidrent) as paid, 
     sum(re.rent * (1 - re.paidrent)) as paid, 
from table_benefactor b join 
    table_realestate re 
    on b.id = re.benefactor 
group by b.id, b.name;