我尝试使用DISTINCT来避免重复数据,但没有工作。 如何避免重复数据?
表1
Employee code Deduction Voucher no Dec_Amount
001 999 50
001 888 20
002 777 100
表2
Employee code Payslip Voucher No Pay_Amount
001 111 100
002 222 200
输出应为:
Employee code Deduction Voucher no Dec_Amount Payslip Voucher No Pay_Amount
001 999 50 111 100
001 888 20
002 777 100 222 200
但我得到了这样的表格。
Employee code Deduction Voucher no Dec_Amount Payslip Voucher No Pay_Amount
001 999 50 111 100
001 888 20 111 100
002 777 100 222 200
答案 0 :(得分:0)
仅使用SQL查询无法获得这些结果。在我看来,你需要它以这种格式显示在table / excel电子表格中。如果是这种情况,你将不得不处理"隐藏"具有一些其他代码的特定条目。原因是您要隐藏的条目与001
员工正确关联。
答案 1 :(得分:0)
虽然我同意这可能在您的前端代码中更有意义,但可以在SQL中执行。使用变量,您将获得类似于SQL Server的ROW_NUMBER函数的函数,然后只加入每个员工代码的第一行。
查看sqlfiddle - http://sqlfiddle.com/#!2/47302/11
SELECT t1.`Employee code`,`Deduction Voucher no`,`Dec_Amount`,
COALESCE(`Payslip Voucher No`,'') as `Payslip Voucher No`,
COALESCE(CAST(`Pay_Amount` as char(10)),'') as `Pay_Amount`
FROM Table2 t2
RIGHT JOIN
(
SELECT @row_num := IF(@prev_value=`Employee code`,@row_num+1,1) AS RowNumber
,`Employee code`,`Deduction Voucher no`,`Dec_Amount`
,@prev_value := `Employee code`
FROM Table1,
(SELECT @row_num := 1) x,
(SELECT @prev_value := '') y
ORDER BY `Employee code`
) t1
ON t1.`Employee code`=t2.`Employee code` AND t1.RowNumber=1
答案 2 :(得分:0)
为了扩展@d.lanza38的答案,DB没有办法告诉table1中的哪一行应该从table2获取数据。请记住,数据库中的数据没有顺序,因此没有“雇员代码001的第一行”的固有概念。
标准(内部)联接将如您所示 - 将它们放在两者上。这实际上是正确的 - 您的表结构表示对于表2中的每个工资单,可以有很多扣除。因此,如果您需要来自两个表的数据,则扣除必须附加匹配的工资单数据。
您无法使用DISTINCT
神奇地修复数据 - 您需要了解数据结构并正确关联它们。
要获取示例中的内容(可能是错误的),请尝试以下SQL:
select
a.Employee_code,
Deduction_Voucher_no,
Dec_Amount,
Payslip_Voucher_No,
Pay_Amount
from
table1 as a
inner join table2 as b on a.employee_code = b.employee_code
where Deduction_Voucher_no = (
select max(Deduction_Voucher_no)
from table1 as c
where a.Employee_code = c.Employee_code)
UNION
select
a2.Employee_code,
Deduction_Voucher_no,
Dec_Amount,
null as Payslip_Voucher_No,
null as Pay_Amount
from
table1 as a2
inner join table2 as b2 on a2.employee_code = b2.employee_code
where Deduction_Voucher_no <> (
select max(Deduction_Voucher_no)
from table1 as c2
where a2.Employee_code = c2.Employee_code)
order by 1,2 desc
注意:未经测试,因为我没有您的数据库,甚至不知道您使用的是哪个数据库引擎。如果它抱怨选择空值,请使用0
或''
替换,具体取决于数据类型。
更新改进了SQL并提供了一个小提琴:http://sqlfiddle.com/#!2/e7fc2/2