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

  • 相关阅读:
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
    Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again。
    redhat 关机注销命令详解
    VirtualBox的四种网络连接方式
    修改RedHat的系统显示时间
    insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
    xen坑随笔 heartbeat dpkg垃圾数据库清除
    tomcat 监控脚本
    负载均衡随笔
    GIT命令介绍
  • 原文地址:https://www.cnblogs.com/qingshan-tang/p/12371475.html
Copyright © 2011-2022 走看看