从subquery中选择summapersubcat作为列

nzkunb0c  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(224)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

两年前关门了。
改进这个问题
给出3个表格(合同、服务、合同和服务)
一个包含4种类型的多个服务的合同(目前,还会有更多)。
我需要的是得到每个合同的所有价格的总和(),按服务类型分组,每个合同一行。
contracts.id、'total\ u service\ u type\ u 1'、'total\ u service\ u type\ u 2'、'total\ u service\ u type\ u 3'、'total\ u service\ u type\ u 4'

合同

身份证件

服务

身份证件
服务类型\u id

合同和服务

合同id
服务id
价格
这是我到目前为止得到的

SELECT c.id,s.servicetype_id,sum(cs.price)as total
FROM contracts c
LEFT JOIN addresses a ON a.id = c.address_id
LEFT JOIN contracts_services cs ON cs.contract_id = c.id
LEFT JOIN services s ON s.id = cs.service_id
WHERE s.servicetype_id IS NOT NULL
GROUP BY c.id,s.servicetype_id
ORDER BY c.id

如何将这些查询结果转换为单个合同行的列?

ecfsfe2w

ecfsfe2w1#

mysql中不能有动态列(据我所知,也不能有任何sql风格)。因此,您只能通过将每个服务类型添加为新的 join 你的问题。为了简洁起见,我在下面的示例中添加了两种服务类型,对于额外的服务类型,只需添加更多 LEFT JOIN .
最后一句话:这是你的痛苦。这个解决方案绝对不灵活。对于添加的每种新服务类型,都必须再次编辑查询。你应该在你的编程语言中寻找解决方案。所以当你打电话的时候 MySQLPHP ,使用您已有的查询,并使用 PHP 重写数组(动态)以获得所需的输出(替换 PHP 使用的编程语言)。

SELECT 
  c.id AS contractId, 
  SUM(cs1.price) AS service1Total,
  SUM(cs2.price) AS service2Total
FROM contracts c
JOIN services s
LEFT JOIN contracts_services cs1 ON 
  cs1.contract_id = c.id 
  AND cs1.service_id = s.id
  AND s.servicetype_id = 1
LEFT JOIN contracts_services cs2 ON 
  cs2.contract_id = c.id 
  AND cs2.service_id = s.id
  AND s.servicetype_id = 2
GROUP BY c.id

sqlfiddle:http://sqlfiddle.com/#!9/4f9a9c/2/0
注意:您可以更换 SUM(cs1.price)IFNULL(SUM(cs1.price), 0) 如果你愿意的话 0 结束 NULL .
edit:在阅读paulspiegel的评论(关于pivot表)之后,使用较少的连接,从而更有可能对数据库服务器友好。但是,与上述查询具有相同的缺点:每次添加新服务类型时都必须对其进行编辑。

SELECT 
  c.id AS contractId, 
  SUM(IF(s.servicetype_id = 1, cs.price, 0)) AS service1Total,
  SUM(IF(s.servicetype_id = 2, cs.price, 0)) AS service2Total
FROM contracts c
LEFT JOIN contracts_services cs ON cs.contract_id = c.id 
LEFT JOIN services s ON cs.service_id = s.id
GROUP BY c.id

相关问题