2017-10-09 89 views
-1

三個表以如下方式彼此連接:
僱員(ID,姓名)工資(ID,EMPLOYEE_ID,VENDOR_ID,TOTAL_AMOUNT,date_paid)由僱員ID
薪水(ID,EMPLOYEE_ID ,Vendor_id)按供應商ID(供應商ID,名稱)
每個員工ID至少有2個供應商。
但是,一個供應商對所有員工都是一樣的 - 「ABC」
我需要供應商ABC未支付的員工名單。
例如:找到丟失的記錄

Employee Vendor Month Total_amount 
123  ABC  Jan 150 
123  DEF  Jan 200 
456  ABC  Jan 150 
456  XYZ  Jan 250 
123  DEF  Feb 200 
456  ABC  Feb 150 
456  XYZ  Feb 250 

我的結果應該EMPLOYEE_ID 123月,作爲供應商ABC不是當月支付。

+0

好的。反思這一點。我認爲你需要一個月/年表來顯示他們沒有支付任何員工的月份。 「ABC」對所有員工都支付的「金額」是多少?太多未答覆的變量。 –

+0

他們每月通過供應商支付員工。是的,金額總是一樣的。 – Radhika

+0

好的。這就是爲什麼你需要一個月/年表來查看他們錯過支付員工的月份。即使它是您在查詢中聲明的臨時表。 –

回答

0

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE table_name (Employee, Vendor, Month, Total_amount) AS 
SELECT 123, 'ABC', 'Jan', 150 FROM DUAL UNION ALL 
SELECT 123, 'DEF', 'Jan', 200 FROM DUAL UNION ALL 
SELECT 456, 'ABC', 'Jan', 150 FROM DUAL UNION ALL 
SELECT 456, 'XYZ', 'Jan', 250 FROM DUAL UNION ALL 
SELECT 123, 'DEF', 'Feb', 200 FROM DUAL UNION ALL 
SELECT 456, 'ABC', 'Feb', 150 FROM DUAL UNION ALL 
SELECT 456, 'XYZ', 'Feb', 250 FROM DUAL; 

查詢1

WITH EVA(Employee, Vendor, Total_Amount) AS (
    SELECT DISTINCT 
     Employee, 
     Vendor, 
     Total_Amount 
    FROM table_name 
), 
Months (Month) AS (
    SELECT DISTINCT MONTH FROM table_name 
) 
SELECT Employee, Vendor, Month, Total_Amount 
FROM EVA CROSS JOIN Months 
MINUS 
SELECT Employee, Vendor, Month, Total_Amount 
FROM table_name 

Results

| EMPLOYEE | VENDOR | MONTH | TOTAL_AMOUNT | 
|----------|--------|-------|--------------| 
|  123 | ABC | Feb |   150 |