Sql 如何编写查询来选择一条记录中的列?
我有疑问Sql 如何编写查询来选择一条记录中的列?,sql,Sql,我有疑问 SELECT pp.id, pp.user_id, CONCAT(pp.last_name, ' ', pp.first_name) AS NAME, pp.pm_part_inst_id, pp.signature_authority_id, pp.max_days, (SELECT SUM(HOUR) FROM timecard_day WHERE timecard_day.timecard_id = t.id AND t.s
SELECT
pp.id,
pp.user_id,
CONCAT(pp.last_name, ' ', pp.first_name) AS NAME,
pp.pm_part_inst_id,
pp.signature_authority_id,
pp.max_days,
(SELECT SUM(HOUR) FROM timecard_day WHERE timecard_day.timecard_id = t.id AND t.status = 1) AS requested_days,
(SELECT SUM(HOUR) FROM timecard_day WHERE timecard_day.timecard_id = t.id AND t.status = 2) AS approved_days
FROM
pm_participant pp
JOIN timecard t ON
t.user_id = pp.user_id
现在的结果是:
id user_id NAME pm_part_inst_id signature_authority_id max_days requested_days approved_days
4 8 test test 1 0 500 NULL 1
4 8 test test 1 0 500 0.5 NULL
id用户\u id名称pm\u零件\u仪器\u id签名\u权限\u id最大请求天数\u批准天数\u天数
4 8测试1 0 500零1
4 8测试1 0 500 0.5零
应该是:
id user_id NAME pm_part_inst_id signature_authority_id max_days requested_days approved_days
4 8 test test 1 0 500 0.5 1
id用户\u id名称pm\u零件\u仪器\u id签名\u权限\u id最大请求天数\u批准天数\u天数
4 8测试1 0 500 0.5 1
我怎么能做到?
谢谢你的帮助 有条件地聚合所有连接结果:
SELECT
pp.id,
pp.user_id,
CONCAT(pp.last_name, ' ', pp.first_name) AS NAME,
pp.pm_part_inst_id,
pp.signature_authority_id,
pp.max_days,
SUM(CASE WHEN t.status = 1 THEN td.HOUR END) AS requested_days,
SUM(CASE WHEN t.status = 2 THEN td.HOUR END) AS approved_days
FROM
pm_participant pp
INNER JOIN timecard t ON t.user_id = pp.user_id
INNER JOIN timecard_day td ON td.timecard_id = t.id
GROUP BY
pp.id,
pp.user_id,
CONCAT(pp.last_name, ' ', pp.first_name),
pp.pm_part_inst_id,
pp.signature_authority_id,
pp.max_days
要查看它是如何工作的(如果工作;根据发布的内容进行猜测),请查看数据,但不进行聚合,而是拆分为列:
SELECT
pp.id,
pp.user_id,
CONCAT(pp.last_name, ' ', pp.first_name) AS NAME,
pp.pm_part_inst_id,
pp.signature_authority_id,
pp.max_days,
'<--this data will be grouped', 'that data will be split and summed-->',
td.status,
td.hour,
(CASE WHEN t.status = 1 THEN td.HOUR END) AS requested_days,
(CASE WHEN t.status = 2 THEN td.HOUR END) AS approved_days
FROM
pm_participant pp
INNER JOIN timecard t ON t.user_id = pp.user_id
INNER JOIN timecard_day td ON td.timecard_id = t.id
选择
pp.id,
pp.user\u id,
CONCAT(pp.last_name),pp.first_name)作为名称,
pp.pm\u零件安装id,
pp.签名\授权\ id,
pp.max_天,
'',
td.status,
td.hour,
(当t.status=1时,则为td.HOUR END)按要求的天数,
(当t.status=2时,则td.HOUR END)为批准的天数
从…起
pm_参与者pp
t.user\u id=pp.user\u id上的内部连接时间卡t
td.timecard\u id=t.id上的内部连接timecard\u day td
您应该在末尾看到四列,其中包含所有小时数据,其他所有列都是相同的值(我在其中放入了一些固定的字符串常量,以指向带有说明的相关数据)
对它们进行分组会将相同的值(字符串常量的左侧)折叠到一行,因此剩下的就是对最后两列(status1或status2被拆分为单独的列)求和。在这种情况下,根据状态将td数据拆分为两列
GROUP BY
和MAX
将完成此工作,假定参与者有一行,时间卡有两行;因此,结果集将有两个rows@HoneyBadgerThank谢谢你的回答!好的,谢谢你的回答。它比我的查询更漂亮,工作也很好!