这个可以查询吗?
Is this possible to query?
我有 4 个表,彼此 link。
- 患者
- 服务
- service_procedures
- patient_service_items
我想知道是否可以查询这个结果:
这是我目前查询的内容,但没有显示我预期的结果:
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
上的数据和结果
我有 4 个表,彼此 link。
- 患者
- 服务
- service_procedures
- patient_service_items
我想知道是否可以查询这个结果:
这是我目前查询的内容,但没有显示我预期的结果:
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
上的数据和结果