前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空。

  需求并不难,用程序代码循环处理就可以了。但是后面涉及到打印报表,只能用纯sql语句生成。开始自己用了union 写的复杂了一些,后来百度了下文章看到一种实现思路,在此记录一下。下面的内容是根据其思路分析自己修改实现的一个demo,也简单扩展了一点实现功能。

直接上代码好了:

  1. -- ----------------------------
  2. -- Table structure for act
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `act`;
  5. CREATE TABLE `act` (
  6. `id` ) NOT NULL AUTO_INCREMENT COMMENT 'id',
  7. `name` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'name',
  8. `type` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'type',
  9. `peple` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'peple',
  10. `age` ) NULL DEFAULT NULL COMMENT 'age',
  11. `sex` ) NULL DEFAULT NULL COMMENT 'sex',
  12. PRIMARY KEY (`id`) USING BTREE
  13. ) ENGINE CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  1. -- ----------------------------
  2. -- Records of act
  3. -- ----------------------------
  4. , , );
  5. , , );
  6. , , );
  7. , , );
  8. , , );
  9. , , );
  10. , , );
  11. , , );
  12. , , );

生成表数据:

下面案列是以type相同与否作为判断条件分组,peple就是type的小写,方便对照观察。后面的Bk结尾的别名字段也是方便对照观察加上的。

实现sql:

  1. SELECT
  2. id,
  3. CASE
  4. WHEN id in ( SELECT MIN(id)
  5. FROM (select * from act) as a
  6. WHERE b.name = a.name
  7. GROUP BY type
  8.  
  9. ) THEN name
  10. WHEN id in ( SELECT MIN(id)
  11. FROM (select * from act) as a
  12. WHERE b.name = a.name
  13. GROUP BY type
  14.  
  15. ) THEN name
  16. ELSE ''
  17. END AS 'name' ,
  18. CASE WHEN id in ( SELECT MIN(id)
  19. FROM (select * from act) as a
  20. WHERE b.type = a.type
  21.  
  22. GROUP BY type
  23.  
  24. ) THEN type
  25. WHEN id in ( SELECT MIN(id)
  26. FROM (select * from act) as a
  27. WHERE b.type = a.type
  28. GROUP BY type
  29.  
  30. ) THEN type
  31. ELSE ''
  32. END AS type,
  33. CASE WHEN id in ( SELECT MIN(id)
  34. FROM (select * from act) as a
  35. WHERE b.age = a.age
  36.  
  37. GROUP BY type
  38.  
  39. ) THEN age
  40. WHEN id in ( SELECT MIN(id)
  41. FROM (select * from act) as a
  42. WHERE b.age = a.age
  43. GROUP BY type
  44.  
  45. ) THEN age
  46. ELSE ''
  47. END AS age,
  48. CASE WHEN id in ( SELECT MIN(id)
  49. FROM (select * from act) as a
  50. WHERE b.sex = a.sex
  51.  
  52. GROUP BY type
  53.  
  54. ) THEN sex
  55. WHEN id in ( SELECT MIN(id)
  56. FROM (select * from act) as a
  57. WHERE b.sex = a.sex
  58. GROUP BY type
  59.  
  60. ) THEN sex
  61. ELSE ''
  62. END AS sex,
  63.  
  64. peple,name as nameBk,age as ageBk,sex as sexBk
  65. FROM (select * from act order by type,id asc) as b

执行结果:

如果干脆要把任意字段置空(不管是不是重复的)也可以:

  1. SELECT
  2. id,
  3. CASE
  4. WHEN id = ( SELECT MIN(id)
  5. FROM (select * from act) as a
  6. WHERE b.type = a.type
  7. GROUP BY type
  8.  
  9. ) THEN name
  10. WHEN id = ( SELECT MIN(id)
  11. FROM (select * from act) as a
  12. WHERE b.type = a.type
  13. GROUP BY type
  14.  
  15. ) THEN name
  16. ELSE ''
  17. END AS name,
  18. CASE WHEN id = ( SELECT MIN(id)
  19. FROM (select * from act) as a
  20. WHERE b.type = a.type
  21.  
  22. GROUP BY type
  23.  
  24. ) THEN type
  25. WHEN id = ( SELECT MIN(id)
  26. FROM (select * from act) as a
  27. WHERE b.type = a.type
  28. GROUP BY type
  29.  
  30. ) THEN type
  31. ELSE ''
  32. END AS type,
  33. CASE WHEN id = ( SELECT MIN(id)
  34. FROM (select * from act) as a
  35. WHERE b.type = a.type
  36.  
  37. GROUP BY type
  38.  
  39. ) THEN age
  40. WHEN id = ( SELECT MIN(id)
  41. FROM (select * from act) as a
  42. WHERE b.type = a.type
  43. GROUP BY type
  44.  
  45. ) THEN age
  46. ELSE ''
  47. END AS age,
  48. CASE WHEN id = ( SELECT MIN(id)
  49. FROM (select * from act) as a
  50. WHERE b.type = a.type
  51.  
  52. GROUP BY type
  53.  
  54. ) THEN sex
  55. WHEN id = ( SELECT MIN(id)
  56. FROM (select * from act) as a
  57. WHERE b.type = a.type
  58. GROUP BY type
  59.  
  60. ) THEN sex
  61. ELSE ''
  62. END AS sex,
  63.  
  64. peple,name as nameBk,age as ageBk,sex as sexBk
  65. FROM (select * from act order by type,id asc) as b

执行结果:

上面案例都是以type作为判断分组条件,如果是有多个字段,直接在后面接着增加就可以了。

Mysql重复数据查询置为空的更多相关文章

  1. mysql重复数据查询

    假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...

  2. 删除MySQL重复数据

    删除MySQL重复数据 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据.因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然 ...

  3. 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)

    上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下. · Mysql mysql的分页可以直接使用关键字limit,句子写起来比较方便. 语法: ① limit m,n -- ...

  4. MySQL:数据查询

    数据查询 一.基本查询语句 1.语法:写一行 select{*<字段列表>}//查询的字段,多个字段用逗号分开 from<表1>,<表2>…//数据表名 {//可选 ...

  5. mysql 大数据 查询方面的测试

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  6. mysql 重复数据防止插入:)

    insert into table (id, name, age) values(1, "A", 19) on duplicate key update name=values(n ...

  7. MySql的数据查询

    SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...

  8. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  9. Python MySQL - 进行数据查询

    #coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...

随机推荐

  1. [luogu1627 CQOI2009] 中位数 (乱搞)

    传送门 Solution 好水的题(ーー;) Code //By Menteur_Hxy #include <map> #include <queue> #include &l ...

  2. SpringBoot 整合 Mybatis 进行CRUD测试开发

    今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...

  3. jupyter记事本的安装和简单应用

    1.概述 jupyter记事本是一个基于Web的前端,被分成单个的代码块或单元.根据需要,单元可以单独运行,也可以一次全部运行.这使得我们可以运行某个场景,看到输出结果,然后回到代码,根据输出结果对代 ...

  4. (9)使用JdbcTemplate【从零开始学Spring Boot】

    整体步骤: (1)   在pom.xml加入jdbcTemplate的依赖: (2)   编写DemoDao类,声明为:@Repository,引入JdbcTemplate (3)   编写DemoS ...

  5. poj 3006水题打素数表

    #include<stdio.h> #include<string.h> #define N 1100000 int isprim[N],prime[N]; void ispr ...

  6. 【ACM】hdu_zs3_1005_String Matching_201308100920

    String Matching Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other)Tota ...

  7. HDU 4505

    哈哈哈哈哈哈哈哈哈,省赛,一等奖,一定的一定的一定的一定的... #include <iostream> #include <cstdio> #include <cstr ...

  8. POJ 1066

    由于到达点时不能绕墙,因为这是无意义的,所以,两点间的最小墙依然是按照直线所穿过的墙计算. #include <iostream> #include <cstdio> #inc ...

  9. visual studio 开发工具SVN集成工具,测试可用,成功集成

    使用说明:https://www.xiazaiba.com/html/24864.html 下载地址:点击下载集成插件

  10. OpenCV打开摄像头失败

    <span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h>< ...