关于“第一列中值相同时,第二列的值多列数据合并成一行到一行”的问题

将一列中多行相同的值只显示在一行 - 推酷
将一列中多行相同的值只显示在一行
数据库环境:SQL SERVER 2008R2
需求如题,左图为初始数据,右图是已实现需求的数据展示
简单说下我的实现思路
1.按id、name排序给原始数据生成行号
2.用递归判断上下行的id是否相等,第一次出现计数器初始值为1,后面再出现则计数器+1
3.对步骤2中生成的结果集再处理,计数器为1的id不变,计数器大于1则id为空字符串
我把实现的代码贴出来
/*准备基础数据*/
AS ( SELECT
'a' AS NAME
'b' AS NAME
'c' AS NAME
'e' AS NAME
'd' AS NAME
'f' AS NAME
'h' AS NAME
'j' AS NAME
),/*按id、name排序生成行号*/
AS ( SELECT
ROW_NUMBER() OVER ( ORDER BY id, name ) AS tid ,
CAST(id AS VARCHAR(2)) id ,
),/*递归设置计数器*/
x2 ( tid, id, name, level )
AS ( SELECT
1 AS level
CASE WHEN t1.id = t2.id THEN level + 1
INNER JOIN x2 t2 ON t1.tid = t2.tid + 1
/*计数器为1则id不动,否则置为空字符串*/
CASE WHEN level = 1 THEN id
先比我的实现,有一网友提供了更简单的实现方式
我们来看一下他是怎么实现的
AS ( SELECT
'a' AS NAME
'b' AS NAME
'c' AS NAME
'e' AS NAME
'd' AS NAME
'f' AS NAME
'h' AS NAME
'j' AS NAME
'j' AS NAME
REPLACE(CASE WHEN ROW_NUMBER() OVER ( PARTITION BY CAST(ID AS VARCHAR(2)) ORDER BY NAME ) && '1'
ELSE CAST(ID AS VARCHAR(20))
END, 0, '') AS ID ,
实现的思路和我一样,但他的方法比我的简单,也容易理解。
我相信,实现该需求的方法不局限于这2种,欢迎各位看官提出更多的解题方法。
(本文完)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格其它在合并单元格区域内的单元格不显示&示例代码如下:
1 import java.io.FileInputS
2 import java.io.FileNotFoundE
3 import java.io.IOE
5 import org.apache.poi.hssf.usermodel.HSSFW
6 import org.apache.poi.ss.usermodel.C
7 import org.apache.poi.ss.usermodel.DataF
8 import org.apache.poi.ss.usermodel.R
9 import org.apache.poi.ss.usermodel.S 10 import org.apache.poi.ss.usermodel.W 11 import org.apache.poi.ss.util.CellRangeA 12 import org.apache.poi.xssf.usermodel.XSSFW 13
14 public class TestExcel { 15
private static final DataFormatter FORMATTER = new DataFormatter(); 16
* 获取单元格内容 19
* @param cell 21
单元格对象 22
* @return 转化为字符串的单元格内容 23
private static String getCellContent(Cell cell) { 25
return FORMATTER.formatCellValue(cell); 26
public static boolean isMergedRegion(Sheet sheet, Cell cell) { 29
// 得到一个sheet中有多少个合并单元格 30
int sheetmergerCount = sheet.getNumMergedRegions(); 31
for (int i = 0; i & sheetmergerC i++) { 32
// 得出具体的合并单元格 33
CellRangeAddress ca = sheet.getMergedRegion(i); 34
// 得到合并单元格的起始行, 结束行, 起始列, 结束列 35
int firstC = ca.getFirstColumn(); 36
int lastC = ca.getLastColumn(); 37
int firstR = ca.getFirstRow(); 38
int lastR = ca.getLastRow(); 39
// 判断该单元格是否在合并单元格范围之内, 如果是, 则返回 true 40
if (cell.getColumnIndex() &= lastC && cell.getColumnIndex() &= firstC) { 41
if (cell.getRowIndex() &= lastR && cell.getRowIndex() &= firstR) { 42
return true; 43
return false; 47
public static String getMergedRegionValue(Sheet sheet, Cell cell) { 50
// 获得一个 sheet 中合并单元格的数量 51
int sheetmergerCount = sheet.getNumMergedRegions(); 52
// 便利合并单元格 53
for (int i = 0; i & sheetmergerC i++) { 54
// 获得合并单元格 55
CellRangeAddress ca = sheet.getMergedRegion(i); 56
// 获得合并单元格的起始行, 结束行, 起始列, 结束列 57
int firstC = ca.getFirstColumn(); 58
int firstR = ca.getFirstRow(); 59
if (cell.getColumnIndex() == firstC && cell.getRowIndex() == firstR) { 61
return "第" + (cell.getRowIndex() + 1) + "行 第" + (cell.getColumnIndex() + 1) + "列 的内容是: "
+ getCellContent(cell) + ","; 63
return ""; 67
private static String getExcelValue(String filePath, int sheetIndex) { 70
String value = ""; 71
// 创建对Excel工作簿文件 73
Workbook book = null; 74
book = new XSSFWorkbook(new FileInputStream(filePath)); 76
} catch (Exception ex) { 77
book = new HSSFWorkbook(new FileInputStream(filePath)); 78
Sheet sheet = book.getSheetAt(sheetIndex); 81
// 获取到Excel文件中的所有行数 82
int rows = sheet.getPhysicalNumberOfRows(); 83
// System.out.println("rows:" + rows); 84
// 遍历行 85
for (int i = 0; i & i++) { 87
// 读取左上端单元格 88
Row row = sheet.getRow(i); 89
// 行不为空 90
if (row != null) { 91
// 获取到Excel文件中的所有的列 92
int cells = row.getPhysicalNumberOfCells(); 93
// System.out.println("cells:" + cells); 94
// 遍历列 96
for (int j = 0; j & j++) { 97
// 获取到列的值 98
Cell cell = row.getCell(j); 99
if (cell != null) {100
if (isMergedRegion(sheet, cell)) {101
value += getMergedRegionValue(sheet, cell);102
} else {103
value += "第" + (i + 1) + "行 第" + (j + 1) + "列 的内容是: " + getCellContent(cell) + ",";104
} catch (FileNotFoundException e) {112
e.printStackTrace();113
} catch (IOException e) {114
e.printStackTrace();115
return118 119
public static void main(String[] args) {122 123
String filePath = "F://example.xls";124
int sheetIndex = 0;125 126
String[] val = getExcelValue(filePath, sheetIndex).split(",");127
for (int i = 0; i & val. i++) {128
System.out.println(val[i]);129如何将word当前页表格中的第一行第二列中的值付给页眉,求救高手_word吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:43,753贴子:
如何将word当前页表格中的第一行第二列中的值付给页眉,求救高手收藏
20年前的ps游戏全新复刻驾临pc端
做个书签,交叉引用。但是,每个表格单独做。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或请教一条sql(多行在某一个字段上的值相同,则根据条件刷选出这多行中的一行)
[问题点数:20分,结帖人sibweo0916]
请教一条sql(多行在某一个字段上的值相同,则根据条件刷选出这多行中的一行)
[问题点数:20分,结帖人sibweo0916]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年6月 MS-SQL Server大版内专家分月排行榜第一2015年5月 MS-SQL Server大版内专家分月排行榜第一2015年4月 MS-SQL Server大版内专家分月排行榜第一2015年3月 MS-SQL Server大版内专家分月排行榜第一2015年2月 MS-SQL Server大版内专家分月排行榜第一2015年1月 MS-SQL Server大版内专家分月排行榜第一2014年12月 MS-SQL Server大版内专家分月排行榜第一2014年11月 MS-SQL Server大版内专家分月排行榜第一2014年10月 MS-SQL Server大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。两个excle表,其中有一列是基本相同的并且不重复的数字,请问怎么将目标值相同的合并到同一行?两个excle表,其中有一列是基本相同的并且不重复的数字(如:学号),请问怎么将目标值相同的合并到同一行?表一:表二:学号 姓名 学号 姓名 001 张三 80 004 丁一 50 002 李四 60 005 赵七 68003 王五 70 001 张三 95006 邓九 100 003 王五 70 要求得到表:001 张三 80 95002 李四 60 003 王五 70 70 004 丁一 50005 赵七 68 006 邓九 100
可以有两个方法以:1、可以做透视表2、可以用vlookup函数去解决.
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 sql 多列 合并一行 的文章

 

随机推荐