建表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:對於這個實現方式我沒有想到更好的方式,感覺有點耗性能,哪位大佬有更好的方式可以留言告訴我。