当前位置: 首页 > news >正文

SQL查询:主从表 报表方式显示

--测试表与测试数据
CREATE TABLE test_main (
id      INT,
value   VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表.
CREATE TABLE test_sub (
id      INT,
main_id INT,
value   VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'A');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 1, 'B');
INSERT INTO test_sub(id, main_id, value) VALUES (3, 1, 'C');
INSERT INTO test_sub(id, main_id, value) VALUES (4, 2, 'D');
INSERT INTO test_sub(id, main_id, value) VALUES (5, 2, 'E');
INSERT INTO test_sub(id, main_id, value) VALUES (6, 2, 'F');

要求:主从表关联的时候,主表仅仅第一条记录显示,后面相同的情况下,不显示
默认情况下
---------- ----------
ONE        A
ONE        B
ONE        C
TWO        D
TWO        E
TWO        F
希望查询结果能变为
---------- ----------
ONE        A
                B
                C
TWO      D
               E
               F
思路:
首先, 根据主表的数据 分组显示 ROW_NUMBER
然后,仅仅显示 ROW_NUMBER = 1 的主表数据, 其他的主表数据不显示
实现
第一步 根据主表的数据 分组显示 ROW_NUMBER
SELECT
test_main.value,
test_sub.value,
ROW_NUMBER() OVER (PARTITION BY test_main.value ORDER BY test_sub.value)
FROM
test_main,
test_sub
WHERE
test_main.id = test_sub.main_id
value      value
---------- ---------- --------------------
ONE        A                             1
ONE        B                             2
ONE        C                             3
TWO        D                             1
TWO        E                             2
TWO        F                             3
第二步 仅仅显示 ROW_NUMBER = 1 的主表数据, 其他的主表数据不显示
SELECT
CASE WHEN
    ROW_NUMBER() OVER (PARTITION BY test_main.value ORDER BY test_sub.value) = 1 THEN test_main.value
    ELSE ''
END AS Main_Value,
test_sub.value
FROM
test_main,
test_sub
WHERE
test_main.id = test_sub.main_id
执行结果
Main_Value value
---------- ----------
ONE        A
           B
           C
TWO        D
           E
           F

转载于:https://www.cnblogs.com/zhangqs008/archive/2013/04/16/3059787.html

相关文章:

  • Linux图形界面中客户端、服务器、窗口管理器之间的关系
  • paste命令
  • 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...
  • Winform开发框架之混合型框架的剖析
  • 折腾13年——Leo张大志小传
  • 《C++.GUI.Programming.with.Qt.4》读书笔记Chapter 1~2
  • 学习 easyui 之二:jQuery 的 ready 函数和 easyloader 的加载回调函数
  • AS3应用程序模块化开发与ApplicationDomain
  • Access restriction: The type BASE64Encoder is not accessible due to restrict
  • 什么是x-window
  • Unity3D 关于yield在collider中的使用
  • ultraWinGrid绑定下拉框
  • 双向循环链表运用(2)
  • Qt ui的动态加载
  • Oracle11gR2 静默建库,删库和配置
  • 「面试题」如何实现一个圣杯布局?
  • echarts花样作死的坑
  • EventListener原理
  • maya建模与骨骼动画快速实现人工鱼
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Sass Day-01
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 排序(1):冒泡排序
  • 组复制官方翻译九、Group Replication Technical Details
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 透过事物看本质的能力怎么培养?
  • $ git push -u origin master 推送到远程库出错
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6)添加vue-cookie
  • (ZT)薛涌:谈贫说富
  • (四)Controller接口控制器详解(三)
  • (学习日记)2024.01.19
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)四层和七层负载均衡的区别
  • (转)项目管理杂谈-我所期望的新人
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .Net FrameWork总结
  • .Net 应用中使用dot trace进行性能诊断
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Autowired和@Resource的区别
  • @Bean, @Component, @Configuration简析
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [AR Foundation] 人脸检测的流程
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C#7] 1.Tuples(元组)
  • [Codeforces] probabilities (R1600) Part.1
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [Gym-102091E] How Many Groups
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流