如何编写这样复杂的查询?

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)