【问题标题】:Creating a counting column query创建计数列查询
【发布时间】:2022-01-19 01:32:52
【问题描述】:

我希望创建一个选择查询,该查询将有一列计算某人在某个月份接受培训的次数。我已经设法让它显示在那个特定月份参加培训课程的人的名单,但我也想向其他所有人展示他们参加的课程计数为 0。我该怎么做?

SELECT 
    carer.carer_firstname, carer.carer_lastname,   
    COUNT(carer_training_link.carer_id) AS sessions_attended_May
FROM 
    carer, carer_training_link 
WHERE 
    carer.carer_id = carer_training_link.carer_id 
    AND carer_training_link.training_date BETWEEN TO_DATE('01/MAY/2019', 'DD/MON/YYYY') 
                                              AND TO_DATE('01/JUN/2019', 'DD/MON/YYYY')
GROUP BY 
    carer.carer_firstname, carer.carer_lastname;

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(差不多 30 年前),不鼓励使用它
  • 另一个要改掉的坏习惯:使用表名作为列名的冗余前缀。还有一个要改掉的坏习惯:在不提供表定义的情况下寻求查询帮助,假设人们可以根据查询代码找出答案。见minimal reproducible exampl
  • @marc_s 感谢您的提醒! :)
  • @EdStevens 我会采纳建议的,谢谢。

标签: sql oracle


【解决方案1】:

您正在使用只能称为古董的连接语法。

您想要一个外部加入,以便包括没有受过培训的护理人员。

日期范围最好与>=< 进行比较。

SELECT 
  c.carer_firstname, c.carer_lastname,   
  COUNT(cl.carer_id) AS sessions_attended_may
FROM carer c
LEFT OUTER JOIN carer_training_link cl
  ON cl.carer_id  = c.carer_id
  AND cl.training_date >= DATE '2019-05-01'
  AND cl.training_date <  DATE '2019-06-01'
GROUP BY c.carer_firstname, c.carer_lastname
ORDER BY c.carer_firstname, c.carer_lastname;

【讨论】:

  • 谢谢!我一定会注意新的加入方法
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2022-10-01
  • 1970-01-01
  • 2021-03-15
  • 2021-04-03
  • 2020-01-12
相关资源
最近更新 更多