这个可以查询吗?

Is this possible to query?

我有 4 个表,彼此 link。

我想知道是否可以查询这个结果:

这是我目前查询的内容,但没有显示我预期的结果:

select
CONCAT('patient', a.id) AS `pame`,
CONCAT('Service',c.id) AS `ServiceName`,
d.code,
d.price,
(SELECT SUM(psi.price) AS `Total Amount` FROM `patient_service_items` AS `psi`) AS `Total Amount`,
(SELECT COUNT(s.service) AS `Total Service` FROM `services` AS `s` INNER JOIN `patient_service_items` AS `psi` ON s.id = psi.serviceid WHERE psi.serviceid IN (SELECT serviceid FROM patient_service_items GROUP BY serviceid)) AS `Total Service`,
(SELECT COUNT(sp.code) AS `Total Procedure` FROM `service_procedures` AS `sp`) AS `Total Procedure`
from
patient_services a
INNER JOIN patient_service_items b on a.id = b.psid
INNER JOIN services c on b.serviceid = c.id
INNER JOIN service_procedures d on b.procedureid = d.id

我的查询结果:

非常感谢任何其他解决方案或替代方案。

谢谢!

如果我没理解错的话,你需要window个函数:

select p.pname, s.servicename, sp.code, sp.price,
       sum(sp.price) over () as totalprice,
       count(distinct s.servicename) over (partition by p.pname) as totalservice,
       count(*) over (partition by p.pname)
from patient_services ps join
     patient_service_items psi
     on ps.id = psi.psid join
     services s
     on ps.serviceid = s.id join
     service_procedures sp
     on psi.procedureid = sp.id
group by p.pname, s.servicename, sp.code, sp.price;

但是,MySQL 不支持 count(distinct) 作为 window 函数。相反,您可以使用:

select p.pname, s.servicename, sp.code, sp.price,
       sum(sp.price) over () as totalprice,
       (dense_rank() over (partition by p.name order by s.servicename asc) +
        dense_rank() over (partition by p.name order by s.servicename desc)
       ) as totalservice,
       count(*) over (partition by p.pname)

一种方法是使用子查询来获得所需的结果。

SELECT Concat('patient', psi.psid)      AS `pame`, 
       Concat('Service', psi.serviceid) AS `serviceName`, 
       sp.code, 
       sp.price, 
       `total amount`, 
       `total service`, 
       `total procedure` 
FROM   patient_service_items psi 
       INNER JOIN (SELECT psid, 
                          Count(DISTINCT psi.serviceid)   AS `Total Service`, 
                          Count(DISTINCT psi.procedureid) AS `Total Procedure`, 
                          Sum(sp.price)                   AS `Total Amount` 
                   FROM   patient_service_items psi 
                          INNER JOIN service_procedures sp 
                                  ON psi.procedureid = sp.id 
                                     AND psi.serviceid = sp.serviceid 
                   GROUP  BY psi.psid) tblinner 
               ON psi.psid = tblinner.psid 
       INNER JOIN service_procedures sp 
               ON psi.procedureid = sp.id 
                  AND psi.serviceid = sp.serviceid 

您可以参考here

上的数据和结果