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

  • 相关阅读:
    053705
    053704
    053703
    053702
    053701
    053700
    053699
    053698
    053697
    HDU 3746 Cyclic Nacklace
  • 原文地址:https://www.cnblogs.com/qingshan-tang/p/12371475.html
Copyright © 2020-2023  润新知