建表sql
CREATE TABLE `tbl_demo` ( `id` varchar(255) COLLATE utf8_bin NOT NULL, `payer_name` varchar(255) COLLATE utf8_bin DEFAULT NULL, `amount` int(255) DEFAULT NULL, `value_day` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
需求
=======》
将图一的数据库中数据按图二规则显示在页面上。
场景:
图一数据是excel导入,所以有可能出现一条数据重复导入的现象,所以要将payerName,amout,valueDay三个字段存在重复的数据挑出来放在一起标红显示,让管理员知道这些数据可能重复 ,然后线下校对进行处理。
技术要求:
首先要对所有数据根据这三个字段进行分组显示,对valueDay降序排序,明确哪条数据存在重复
实现分组显示并且排序
1.group by(mysql)实现:
SELECT * FROM tbl_demo AS demo GROUP BY demo.value_day, demo.amount, demo.payer_name, demo.id ORDER BY demo.value_day DESC
测试发现,mysql数据库可以用group by简单实现分组显示,但是相同的sql在sql server上却无法实现。
2.order by实现:
SELECT * FROM tbl_demo AS demo ORDER BY demo.value_day DESC, demo.amount, demo.payer_name, demo.id
tips:order by多字段其实可以理解为将多字段拼接之后进行排序,完全可以实现分组显示,个人觉得比group by还要容易理解一些。
实现明确哪条数据重复
实现逻辑:
先用上面的sql查出所有数据,然后在sql中对查出的每条数据做一个子查询,查找当前数据在表中是否有重复数据。
SELECT *, CASE WHEN ( SELECT count( * ) FROM tbl_demo AS d WHERE d.value_day = demo.value_day AND d.amount = demo.amount AND d.payer_name = demo.payer_name ) > 1 THEN '重复' ELSE '未重复' END AS repeatFlag FROM tbl_demo AS demo ORDER BY demo.value_day DESC, demo.amount, demo.payer_name, demo.id
tips:对于这个实现方式我没有想到更好的方式,感觉有点耗性能,哪位大佬有更好的方式可以留言告诉我。