2017-10-09 67 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 |