我在SQL Server数据库中有这三个表(Soknad,Prognose和Did):
表Soknad有列:S_ID(键),S_REFNR
表Prognose有列:P_ID(键),P_S_ID
表是否有列:D_ID(键),D_S_ID,Did_Something
Prognose.P_S_ID是Soknad.S_ID的外键。 Did.D_S_ID是Soknad.S_ID的外键。
表格是这样的:
SOKNAD
S_ID | S_REFNR |
1 | abc |
2 | cbc |
3 | sdf |
PROGNOSE
P_ID | P_S_ID |
10 | 1 |
11 | 2 |
DID
D_ID | D_S_ID | D_Did_Something |
100 | 1 | 1 |
101 | 1 | 1 |
102 | 1 | 0 |
103 | 2 | 1 |
104 | 2 | 1 |
我想加入这些表(如view或select语句)。在Did表中,应返回一列Did_Something列,以及值为1(一)的同一列的计数。 结果应该是:
S_ID | S_REFNR | P_ID | Count_D_Did_Something | Count_D_Did_Something_Is_One |
1 | abc | 10 | 3 | 2 |
2 | cbc | 11 | 2 | 2 |
3 | sdf | | | |
任何帮助将不胜感激!
答案 0 :(得分:1)
我相信您要做的是连接两个表,并将行与左表匹配的计数放在每个表的不同列中。
这样就可以实现。
select t1.id, count(t2.id) t2_count , count(t3.id) t3_count
from table1 as t1
left outer join table2 as t2 on t2.table1_id = t1.id
left outer join table3 as t3 on t3.table1_id = t1.id
group by t1.id;
要根据其中一个外部联接表的条件完成所需的计数,您可以这样做,使用派生表...
select t1.id, count(t2.id) t2_count, count(tt2.mCount) Did_SomethingCount, count(t3.id) t3_count
from table1 as t1
left outer join table2 as t2 on t2.table1_id = t1.id
left outer join (select count(*), table1_id mCount from table2 where Did_Something = 1 group by table1_id) as tt2 on tt2.table1_id = t1.id
left outer join table3 as t3 on t3.table1_id = t1.id
group by t1.id;
答案 1 :(得分:0)
你走了:
select s.s_id,
p.p_id,
count(d.Did_Something) as Count_D_Did_Something, -- nulls won't be counted
sum(CASE WHEN d.Did_Something = 1 THEN 1 ELSE 0 END) as Count_D_Did_Something_is_one
from Soknad as s
left join Prognose as p on p.P_S_ID = s.s_id
left join Did as d on d.D_S_ID = s.s_id
答案 2 :(得分:0)
这应该只是给出你需要的结果。注意,我只想总结一下,当你想要数量为具有一个的值时,
SELECT S.S_ID, S.REFNR, P.P_ID, COUNT(D.D_DID_SOMETHING) AS COUNT_D_DID_SOMETHING,
SUM(D_DID_SOMETHING) AS COUNT_D_DID_SOMETHING_IS_ONE
FROM SOKNAD AS S
INNER JOIN PROGNOSE AS P
ON P.P_S_ID = S.S_ID
INNER JOIN DID AS D
ON D.D_S_ID = S.S_ID
GROUP BY S.S_ID, S.REFNR, P.P_ID