Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何编写查询来选择一条记录中的列?_Sql - Fatal编程技术网

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谢谢你的回答!好的,谢谢你的回答。它比我的查询更漂亮,工作也很好!