如何编写这样复杂的查询?
How to write complicated query like this?
我有 table 份报告,其中包含:
rid reparti
R00001 Ortopedi
R00002 Kardiologji
R00003 Gjinekologji
Table 名医生,其中包含:
did demri dmbiemri titullli rruga qyteti kp shteti mob fix email rid paga
D00001 Shaban Merovci Dr Familjar Mic Sokoli Vushtrri 42000 Kosove 37744842203 28570369 shmerovci@gmail.com R00001 1000
Table 约会:
tid pid did rid data_koha konfirmimi
T00001 P00001 D00010 R00002 2015-12-20 08:30:00 1
T00002 P00009 D00004 R00003 2015-12-25 10:30:00 1
Table 住院(没有预约就不能住院):
hpid pid did data_shtrimi sid terapia diagnoza tid
HP0001 P00009 D00004 2015-12-13 S00001 Barera Hemorislapaskus T00002
HP0002 P00006 D00002 2015-12-22 S00010 Kimoterapi Fragaria vesca T00008
HP0003 P00001 D00002 2015-12-20 S00008 Barera Depresion T00001
Table 账单包含:
fid pid hpid cmimi_patvsh tvsh cmimi_metvsh data_fatures
F00001 P00002 HP0005 85.00 0.18 100.30 2016-02-13
F00002 P00009 HP0001 700.00 0.18 826.00 2016-12-10
F00003 P00001 HP0003 120.00 0.18 141.60 2015-12-29
我的目的是为每个报告找到在其上工作的 NrDoktoreve 的医生 (did) 数量,该部分的 PagaMesatare 的平均 (paga),NrHospitalizimeve 今年实现的住院人数,账单总和(值cmimi_patvsh,值 cmimi_metvsh) 今年实现。所有这些都应该在一个数据集列表中。
当然那些 table 包含更多数据我只是在这里放了一些例子。
查询并不太复杂,方法是识别连接列(table 组合在一起),编写连接,按 RID 对 table 进行分组(因为你想要每个 RID 的所有结果),最后选择字段。
我没有可用于测试的 MySQL,但查询应如下所示:
select
rid,
count(distinct did) NrDoktoreve,
avg(cmimi_metvsh) as PagaMesatare,
count(distinct hpid) as NrHospitalizimeve,
sum(cmimi_patvsh),
sum(cmimi_metvsh)
from reparts r
left join appointments a on r.rid = a.rid
left join hospitalization h on a.tod = h.tid
left join doctors d on r.rid = d.rid
left join bills b on a.pid = b.pid
group by rid
order by rid;
如果您不喜欢table 编写 SQL,您可以考虑图形工具,如 DbSchema (http://www.dbschema.com/)(只是许多可用工具中的一个示例,但它确实有效MySQL).
没问题
这是我的问题的解决方案
select t1.rid,t1.reparti,t1.NrDoktoreve,t1.PagaMesatare,t2.NrHospitalizimeve,t3.VleraPaTvsh,t3.VleraMeTvsh from(
(select r.rid,r.reparti,count(d.did) as NrDoktoreve,avg(d.paga) as PagaMesatare from repartet r
left join doktoret d on r.rid=d.rid
group by r.rid order by r.rid ) as t1 left join
(
select count(h.hpid) as NrHospitalizimeve ,r.rid
from faturat f
inner join hospitalizimet h on f.hpid=h.hpid
inner join terminet t on h.tid=t.tid
inner join repartet r on t.rid=r.rid
where h.data_shtrimit between (curdate()-interval 1 year) and curdate()
group by r.rid order by r.rid) as t2 on t1.rid=t2.rid left join
(select sum(f.cmimi_patvsh) as VleraPaTvsh,sum(f.cmimi_metvsh) as VleraMeTvsh,r.rid
from repartet r
left join terminet t on r.rid=t.rid
left join hospitalizimet h on t.tid=h.tid
left join faturat f on h.hpid=f.hpid
where data_fatures between (curdate()-interval 1 year) and curdate()
group by r.rid order by r.rid)as t3 on t2.rid=t3.rid)
我有 table 份报告,其中包含:
rid reparti
R00001 Ortopedi
R00002 Kardiologji
R00003 Gjinekologji
Table 名医生,其中包含:
did demri dmbiemri titullli rruga qyteti kp shteti mob fix email rid paga
D00001 Shaban Merovci Dr Familjar Mic Sokoli Vushtrri 42000 Kosove 37744842203 28570369 shmerovci@gmail.com R00001 1000
Table 约会:
tid pid did rid data_koha konfirmimi
T00001 P00001 D00010 R00002 2015-12-20 08:30:00 1
T00002 P00009 D00004 R00003 2015-12-25 10:30:00 1
Table 住院(没有预约就不能住院):
hpid pid did data_shtrimi sid terapia diagnoza tid
HP0001 P00009 D00004 2015-12-13 S00001 Barera Hemorislapaskus T00002
HP0002 P00006 D00002 2015-12-22 S00010 Kimoterapi Fragaria vesca T00008
HP0003 P00001 D00002 2015-12-20 S00008 Barera Depresion T00001
Table 账单包含:
fid pid hpid cmimi_patvsh tvsh cmimi_metvsh data_fatures
F00001 P00002 HP0005 85.00 0.18 100.30 2016-02-13
F00002 P00009 HP0001 700.00 0.18 826.00 2016-12-10
F00003 P00001 HP0003 120.00 0.18 141.60 2015-12-29
我的目的是为每个报告找到在其上工作的 NrDoktoreve 的医生 (did) 数量,该部分的 PagaMesatare 的平均 (paga),NrHospitalizimeve 今年实现的住院人数,账单总和(值cmimi_patvsh,值 cmimi_metvsh) 今年实现。所有这些都应该在一个数据集列表中。
当然那些 table 包含更多数据我只是在这里放了一些例子。
查询并不太复杂,方法是识别连接列(table 组合在一起),编写连接,按 RID 对 table 进行分组(因为你想要每个 RID 的所有结果),最后选择字段。 我没有可用于测试的 MySQL,但查询应如下所示:
select
rid,
count(distinct did) NrDoktoreve,
avg(cmimi_metvsh) as PagaMesatare,
count(distinct hpid) as NrHospitalizimeve,
sum(cmimi_patvsh),
sum(cmimi_metvsh)
from reparts r
left join appointments a on r.rid = a.rid
left join hospitalization h on a.tod = h.tid
left join doctors d on r.rid = d.rid
left join bills b on a.pid = b.pid
group by rid
order by rid;
如果您不喜欢table 编写 SQL,您可以考虑图形工具,如 DbSchema (http://www.dbschema.com/)(只是许多可用工具中的一个示例,但它确实有效MySQL).
没问题这是我的问题的解决方案
select t1.rid,t1.reparti,t1.NrDoktoreve,t1.PagaMesatare,t2.NrHospitalizimeve,t3.VleraPaTvsh,t3.VleraMeTvsh from(
(select r.rid,r.reparti,count(d.did) as NrDoktoreve,avg(d.paga) as PagaMesatare from repartet r
left join doktoret d on r.rid=d.rid
group by r.rid order by r.rid ) as t1 left join
(
select count(h.hpid) as NrHospitalizimeve ,r.rid
from faturat f
inner join hospitalizimet h on f.hpid=h.hpid
inner join terminet t on h.tid=t.tid
inner join repartet r on t.rid=r.rid
where h.data_shtrimit between (curdate()-interval 1 year) and curdate()
group by r.rid order by r.rid) as t2 on t1.rid=t2.rid left join
(select sum(f.cmimi_patvsh) as VleraPaTvsh,sum(f.cmimi_metvsh) as VleraMeTvsh,r.rid
from repartet r
left join terminet t on r.rid=t.rid
left join hospitalizimet h on t.tid=h.tid
left join faturat f on h.hpid=f.hpid
where data_fatures between (curdate()-interval 1 year) and curdate()
group by r.rid order by r.rid)as t3 on t2.rid=t3.rid)