Mysql 如何避免sql命令中的重复数据
我尝试使用DISTINCT来避免数据重复,但并没有工作。 如何避免重复数据 表1 表2 输出应为:Mysql 如何避免sql命令中的重复数据,mysql,sql,Mysql,Sql,我尝试使用DISTINCT来避免数据重复,但并没有工作。 如何避免重复数据 表1 表2 输出应为: Employee code Deduction Voucher no Dec_Amount Payslip Voucher No Pay_Amount 001 999 50 111 100 001 888
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
仅使用SQL查询无法获得这些结果。在我看来,您需要以这种格式显示在表格/excel电子表格中。如果是这种情况,则必须使用其他代码来处理特定条目的隐藏。原因是您要隐藏的条目与001 employee正确关联。虽然我同意在前端代码中这样做可能更有意义,但在SQL中这样做是可能的。使用一个变量,可以得到一个类似于SQL Server的ROW_NUMBER函数的函数,然后只在每个员工代码的第一行进行联接 看小提琴-
为了扩展@d.lanza38的答案,DB无法判断表1中的哪一行应该从表2中获取数据。请记住,数据库中的数据没有顺序,因此没有员工代码为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并提供了一个提示:您是否查看了组By我很难读取您的表架构信息很难知道列名的开始/结束位置。你能重新格式化吗?此外,请提供导致复制的SQL。
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
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
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