Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Oracle 对特定列使用DISTINCT_Oracle_Distinct - Fatal编程技术网

Oracle 对特定列使用DISTINCT

Oracle 对特定列使用DISTINCT,oracle,distinct,Oracle,Distinct,当我使用上面的查询时,它会导致上述所有属性的不同组合。由于employee_id(作为employees的主键)是唯一的,因此查询将生成表中的所有行 我希望有一个结果集,它具有佣金pct和部门id的不同组合。因此,应该如何形成查询。当我试图把区别中间作为 select distinct employee_id, first_name, commission_pct, department_id from employees; 这导致了一个错误 select employee_id, f

当我使用上面的查询时,它会导致上述所有属性的不同组合。由于employee_id(作为employees的主键)是唯一的,因此查询将生成表中的所有行

我希望有一个结果集,它具有佣金pct和部门id的不同组合。因此,应该如何形成查询。当我试图把<代码>区别中间作为

select distinct  employee_id, first_name,  commission_pct, department_id from
employees;
这导致了一个错误

select   employee_id, first_name, distinct commission_pct, department_id from
    employees; 

如何形成一个结果只有佣金和部门id的不同组合的查询。该表来自oracle的
HR
schema。

您必须删除两列才能进行不同的查询

ORA-00936-missing expression
事实上,如果您的第二个查询可以工作,您希望在前两列中看到什么?考虑实例数据

select distinct commission_pct, department_id from
employees; 
您只希望得到这样的两行结果

| employee_id | first_name | commission_pct | department_id |
|     1       |     "x"    |      "b"       |       3       |
|     2       |     "y"    |      "b"       |       3       |
|     1       |     "x"    |      "c"       |       4       |
|     2       |     "y"    |      "c"       |       4       |
但是你对前两栏有什么期待呢?

你能试试这个吗

| employee_id | first_name | commission_pct | department_id |
|     ?       |      ?     |      "b"       |       3       |
|     ?       |      ?     |      "c"       |       4       |
如果您不关心特定行,则使用聚合函数

SELECT
  NAME1,
  PH
FROM
      (WITH T
           AS (SELECT
                    'mark' NAME1,
                    '1234567' PH
              FROM
                    DUAL
              UNION ALL
              SELECT
                    'bailey',
                    '456789'
              FROM
                    DUAL
              UNION ALL
              SELECT
                    'mark',
                    '987654'
              FROM
                    DUAL)
       SELECT
            NAME1,
            PH,
            ROW_NUMBER ( ) OVER (PARTITION BY NAME1 ORDER BY NAME1) SEQ
       FROM
            T)
WHERE
      SEQ = 1;

你的要求是不可能的。您不能选择所有员工id,但只有不同的佣金pct和部门id

所以仔细想想,你想展示什么:

  • 所有不同的佣金,仅限部门id
  • 所有不同的佣金、部门id和相关员工人数
  • 所有不同的佣金、部门id和相关员工是否分开
  • 所有员工,但如果佣金pct和部门id与前一行相同,则为空

第一个问题可以用不同的方法解决。第二个和第三个带有GROUP BY(加上count或listagg)。最后一个问题将通过分析函数LAG解决。

您能否举例说明,根据您的要求,第一次查询返回的哪些行不应出现。您可以在
佣金和部门id
上使用group by。如果你不知道怎么做,请回复。
SELECT
      NAME1,
      MAX ( PH ) PH
FROM
      T
GROUP BY
      NAME1;