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:对于这个实现方式我没有想到更好的方式,感觉有点耗性能,哪位大佬有更好的方式可以留言告诉我。

原文地址:https://www.cnblogs.com/qingshan-tang/p/12371475.html