【问题标题】:SQL Query to get the count of a particular value in a columnSQL 查询以获取列中特定值的计数
【发布时间】:2022-01-12 01:28:33
【问题描述】:

我使用下面的查询来获取几列。现在,此查询运行良好,并提供以下输出-

person_number         company               rule_id                 overtime_measure_hours              Reg_hours           Hour_type
10928                xyz                    y33t                            10                              10               Bereavement
10928                xyz                    y33t                            10                              10               Vacation
10928                xyz                    y33t                            10                              10               Paid Personal

3638                 abc                    y33t                            8                               8                           

即我得到了所有列的所有正确数据。但是,如果 hour_type 列中没有数据,我不会仅使用 reg_hours 或 overtime_measure_hours 获得任何行。 我想调整下面的查询,以便我计算最终输出中的常规元素,如果它大于 2,那么上面的输出就会出现,如果 它是 1,那么没有 Hour_type 的单行就像第 4 行。我可以将 where 条件放在 count 中还是有其他方法

SELECT person_number,
       company,
       rule_id,
       Sum(CASE
             WHEN elements = '1_5X' THEN measure
           END) AS overtime_measure_hours,
       Sum(CASE
             WHEN elements LIKE 'Regular%' THEN measure
           END) AS Reg_hours,
       hour     Hour_type
FROM   (SELECT person_number,
               company,
               rule_id,
               elements,
               papf.hour
        FROM   per_all_people_f papf,
               co_table co,
               rule_table RULE,
               time_track elements
        WHERE  elements.person_id = papf.person_id
               AND co.co_id = papf.co_id
               AND rule_table.rule_id = elements.rule_id)
UNION
SELECT person_number,
       company,
       rule_id,
       Sum(CASE
             WHEN elements = '1_5X' THEN measure
           END)      AS overtime_measure_hours,
       Sum(CASE
             WHEN elements LIKE 'Regular%' THEN measure
           END)      AS Reg_hours,
       absences_name Hour_type
FROM   (SELECT person_number,
               company,
               rule_id,
               elements,
               absences_name
        FROM   per_all_people_f papf,
               co_table co,
               rule_table RULE,
               time_track elements,
               absence_table ABSENCES_name
        WHERE  elements.person_id = papf.person_id
               AND co.co_id = papf.co_id
               AND rule_table.rule_id = elements.rule_id
               AND ABSENCES_name.person_id = papf.person_id) 

【问题讨论】:

  • 1992年JOIN语法被发明;在将近 三个十年之后,您不认为是时候开始使用它了吗?然后你可以开始使用LEFT OUTER JOIN 而不是(+),它的好处是它可读并且实际上可以工作(+) 在某些情况下它不起作用)
  • 请提供示例数据并描述为什么当前输出不是您想要的。还请最小化您的示例代码,因为与具有所需列的单个表相比,所有表对结果没有特殊影响。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

正如@MatBailie 所说,使用“LEFT OUTER JOIN”。
https://www.w3schools.com/sql/sql_join_left.asp

→ 那么即使“Hour Type”为NULL,你也会得到结果

我想你想要这样的东西 - 我实际上不确定你的列“Hour_type”包含在哪个表中:

SELECT
  person_number,
  company,
  rule_id,
  Sum(CASE WHEN elements = '1_5X' THEN measure END) AS vertime_measure_hours,
  Sum(CASE WHEN elements LIKE 'Regular%' THEN measure END) AS Reg_hours,
  hour Hour_type 
FROM
  co_table co,
  rule_table RULE,
  time_track elements,
  absence_table ABSENCES_name
  LEFT OUTER JOIN per_all_people_f papf ON elements.person_id = papf.person_id AND ABSENCES_name.person_id = papf.person_id)
WHERE
  co.co_id = papf.co_id
  AND rule_table.rule_id = elements.rule_id

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2020-09-14
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多