sql多字段分組排序顯示全部數據


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM