【问题标题】:Count the filtered data from multiple tables in SQL统计SQL中多张表过滤后的数据
【发布时间】:2019-11-11 14:03:38
【问题描述】:

我有 2 个表 config_location_workstation 和 asset_workstation,它们都有 floor 和 workstation_number 列。

我希望查询返回如下内容:

地板| SUM 生产工作站 |总人数

下面的代码来自另一个来源,我能够得出总和,但数字不正确,因为我想要得到的是所有生产工作站的数量。

SELECT config_location_workstation1.floor,
       (SELECT COUNT(config_location_workstation2.workstation_number)
        FROM config_location_workstation AS config_location_workstation2
        WHERE config_location_workstation2.floor = config_location_workstation1.floor) AS SUM_FLOOR,
       (SELECT COUNT(asset_workstation2.workstation_number)
        FROM asset_workstation AS asset_workstation2
        WHERE asset_workstation2.floor = config_location_workstation1.floor) AS SUM_HEAD
FROM config_location_workstation AS config_location_workstation1
INNER JOIN asset_workstation AS asset_workstation1
    ON (config_location_workstation1.workstation_number = asset_workstation1.workstation_number)
WHERE config_location_workstation1.workstation_name = 'NORTH PRODUCTION'
GROUP BY config_location_workstation1.floor

问题是 WHERE 无法处理此代码。 工作站列总和无效。它正在拉起所有条目。我只需要查询所有 PRODUCTION 工作站

这是当前的输出。

+-------+-------------+------+------+
| Floor | Head Count  | Workstations|
+-------+-------------+------+------+
| 18TH  | 696         | 576         |
| 19TH  | 381         | 463         |
| 20TH  | 380         | 760         |
+-------+-------------+------+------+

所有生产工作站的预期输出

+-------+-------------+------+------+
| Floor | Head Count  | Workstations|
+-------+-------------+------+------+
| 18TH  | 696         | 497         |
| 19TH  | 381         | 388         |
| 20TH  | 380         | 659         |
+-------+-------------+------+------+

【问题讨论】:

    标签: mysql sql join count


    【解决方案1】:

    也许你可以尝试使用子查询

    select * from (
    SELECT config_location_workstation1.floor,config_location_workstation1.workstation_name as z,
           (SELECT COUNT(config_location_workstation2.workstation_number)
            FROM config_location_workstation AS config_location_workstation2
            WHERE config_location_workstation2.floor = config_location_workstation1.floor) AS SUM_FLOOR,
           (SELECT COUNT(asset_workstation2.workstation_number)
            FROM asset_workstation AS asset_workstation2
            WHERE asset_workstation2.floor = config_location_workstation1.floor) AS SUM_HEAD
    FROM config_location_workstation AS config_location_workstation1
    INNER JOIN asset_workstation AS asset_workstation1
        ON (config_location_workstation1.workstation_number = asset_workstation1.workstation_number)
    GROUP BY config_location_workstation1.floor
    ) x
    WHERE z = 'NORTH PRODUCTION'
    

    更新:

    select x.*,y.* from ( SELECT *, COUNT(workstation_name) as COUNT_FLOOR 
    FROM config_location_workstation WHERE workstation_name LIKE '%PRODUCTION%' GROUP BY floor)x 
    join 
    (SELECT *, COUNT(floor) as COUNT_USERS FROM asset_workstation GROUP BY floor) y on 
    x.workstation_number = y.workstation_number
    

    【讨论】:

    • 你的意思是根本没有结果?
    • 你能评论第一行和最后两行并执行查询吗?之后你可以检查你在 Z 列中得到了什么结果
    • 按照您的说明注释掉这些行,我得到相同数字的重复结果 z 的结果是 config_location_workstation 列中的所有工作站名称。
    • select x.*,y.* from ( SELECT *, COUNT(workstation_name) as COUNT_FLOOR FROM config_location_workstation WHERE workstation_name LIKE '%PRODUCTION%' GROUP BY floor)x join (SELECT *, COUNT(floor) as COUNT_USERS FROM asset_workstation GROUP BY floor) y on x.workstation_number = y.workstation_number
    • 太棒了。我已经更新了答案。您可以将其标记为正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多