2013-12-20 70 views
0
select distinct employee_id, first_name, commission_pct, department_id from 
employees; 

當我使用上述查詢時,它會導致上述所有屬性的不同組合。由於employee_id(是員工的主鍵)是唯一的,因此查詢會生成表中的所有行。對特定列使用DISTINCT

我想有一個結果集,具有不同的commission_pct和department_id組合。所以如何形成查詢。當我試圖以包括中間DISTINCT作爲

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

這是導致錯誤

ORA-00936-missing expression 

如何形成一個查詢其結果有佣金的唯一不同的組合和department_id.The表來自HR模式的oracle。

+1

您能否詳細說明您的第一個查詢返回哪些行按照您的需求不應出現的行。 – rshetye

+0

你可以在'commission和department_id'上使用group by。如果您無法弄清楚如何操作,請回複評論。 –

回答

2

你要求什麼是不可能的。您不能選擇所有員工ID,但只能選擇不同的commission_pct和department_id。

所以想好了,你想展示一下:

  • 所有不同COMMISSION_PCT,只有部門標識?
  • 所有不同的commission_pct,department_id和相關員工的數量?
  • 所有不同的commission_pct,department_id和相關的員工逗號分開了嗎?
  • 所有員工,但commission_pct和department_id中的空值與之前行中的相同?

第一個可以用DISTINCT來解決。 GROUP BY的第二個和第三個(加上count或listagg)。最後一個將通過分析函數LAG解決。

1

之前已刪除兩列不同

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  | 

但是你怎麼在頭兩列期待?

0

你可以試試這個嗎?

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; 

如果你在一個特定的行不關心,然後使用聚合函數

SELECT 
     NAME1, 
     MAX (PH) PH 
FROM 
     T 
GROUP BY 
     NAME1;