【问题标题】:Counting Distinct Columns Based on Count of third column根据第三列的计数计算不同的列
【发布时间】:2014-06-19 15:34:33
【问题描述】:

我的查询:

SELECT DISTINCT job_id, cust_id, a.skill_id FROM aaa.jp_job_skill_ref a INNER JOIN aaa.jp_cust_skill_ref b ON a.skill_id = b.skill_id ORDER BY `job_id`, `cust_id`, `skill_id`;

返回 3 列数据。但是,这两个表都是具有数百个相同 cust_id 和 Skill_id 或 job_id 和 Skill_id 的引用表,因此按 job_id 和 cust_id 分组的 count(a.skill_id) 返回的 Skill_id 计数为 30+

 job_id, cust_id, skill_id
     2,       1,        1
     2,       1,        2
     2,       1,        9
     2,       3,        1
     2,       3,        2
     2,       3,        9
     2,       3,       10
     2,       4,        1
     2,       4,        9
     3,       1,       12
     3,       3,       10
     3,       4,       12

我希望它返回的是作业 ID、客户 ID 和不同 Skill_ID 的计数。返回以下数据集我缺少什么:?

job_id, cust_id, skill_id
'2',   '1',     '3'
'2',   '3',     '4'
'2',   '4',     '2'
'3',   '1',     '1'
'3',   '3',     '1'
'3',   '4',     '1'

【问题讨论】:

  • 不明显?然后将其从查询中取出?
  • 这个问题不是很好 - 大概你误解了 DISTINCT 运算符的含义/目的
  • @Strawberry 抱歉,我编辑了问题以进一步澄清。我想要 job_id、cust_id 以及 job id 和 cust id 不同的行数

标签: mysql sql database multidimensional-array


【解决方案1】:

你想要一个group by

SELECT job_id, cust_id, count(distinct a.skill_id)
FROM aaa.jp_job_skill_ref a INNER JOIN
     aaa.jp_cust_skill_ref b
     ON a.skill_id = b.skill_id
GROUP BY `job_id`, `cust_id`;

这是一个非常基本的 SQL 查询。 group by 是 SQL 语言的重要组成部分。您可能应该研究一下它,以便您可以使用 SQL。

【讨论】:

  • 这会很好用,但是我拉的两个参考表有多个相同的 cust_id 和 Skill_id 行,或者 job_id 和 Skill_id。所以它变成了 98 的计数,而不是像选择原始不同查询那样的 3 计数
  • 你想要count(distinct a.skill_id)吗?
  • @flaschenpost 。 . .确实。仔细阅读后,最初的问题很清楚,这就是 OP 想要的。
  • count(distinct a.skill_id) 返回一行,其中包含第一个工作、第一个客户和 7 个计数(我很确定这是不对的)
  • @Danejir。 . .即使您有 group by 子句,它也会产生一行?
【解决方案2】:
SELECT DISTINCT CONCAT(job_id, cust_id), a.skill_id 
FROM aaa.jp_job_skill_ref a 
INNER JOIN aaa.jp_cust_skill_ref b 
ON a.skill_id = b.skill_id 
ORDER BY `job_id`, `cust_id`, `skill_id`;

【讨论】:

    【解决方案3】:

    你在找这个吗?

    select 
    j1.job_id,
    j1.cust_id,
    j2.cnt as skill_id
    from jp_job_skill_ref j1
    inner join (
      select 
      job_id,
      cust_id,
      count(skill_id) as `cnt`
      from jp_job_skill_ref 
      group by job_id,cust_id
    
    )j2
    on j1.job_id = j2.job_id AND j1.cust_id = j2.cust_id
    group by j1.job_id,j1.cust_id;
    

    如果您需要不同的技能 ID 计数,只需替换

    count(skill_id) as `cnt`
    

    count(distinct skill_id) as `cnt` 
    

    DEMO

    在示例中,我已将表名 aaa.jp_job_skill_ref 替换为 jp_job_skill_ref

    【讨论】:

      【解决方案4】:
      SELECT 2 job_id, 1 cust_id, 3 skill_id
      UNION
      SELECT 2,3,4
      UNION
      SELECT 2,4,2
      UNION
      SELECT 3,1,1
      UNION
      SELECT 3,3,1
      UNION
      SELECT 3,4,1;
      

      【讨论】:

      • 这真的回答了 OP 的问题吗?我在这里看不到计数计算
      • 是的。如上所述,这完全满足了 OP 的要求。如果 OP 想要一个更好的答案,他们可能会问一个更好的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2021-09-13
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      相关资源
      最近更新 更多