精华内容
下载资源
问答
  • 但是这些数据需要和另外的费用报销系统的数据关联,费用报销系统的费用项目是横向的,用费用项目、金额的多行来表达。那么这里工资的数据如何转换成行呢? 在Kettle里面做一个转行的转换就行。参考如下。 ...

     

    原始需求如下:

    业务系统设置成这样,见截图。

    工资项目为了方便录入,都是做成列的。

    但是这些数据需要和另外的费用报销系统的数据关联,费用报销系统的费用项目是横向的,用费用项目、金额的多行来表达。那么这里工资的数据如何转换成行呢?

    在Kettle里面做一个列转行的转换就行。参考如下。

     

    其中表输入的数据预览如下。

     

     行专列设置如下:其中第1列是选择字段,第2、3列是手工填写

     

    转换后的工资数据都会放入到最近的一个重新命名的工资字段里面的,所以把这个字段改为金额。

     

    按照需求实现了多列合并到一列多行的数据。

     

    【Kettle置顶】Kettle 系列随笔

    转载于:https://www.cnblogs.com/Bruce_H21/p/9613910.html

    展开全文
  • 需求:按照分组,将条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) NULL,[town] [nvarchar](255) NULL); insert into t2 values(1,'...

    SQL 列转行,即多行合并成一条

     

    需求:按照分组,将多条记录内容合并成一条,效果如下:

    数据库示例:

    复制代码
    CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) NULL,[town] [nvarchar](255) NULL);
    insert into t2 values(1,'淮上区','曹老集镇');
    insert into t2 values(2,'淮上区','淮滨街道');
    insert into t2 values(3,'淮上区','梅桥乡');
    insert into t2 values(4,'淮上区','吴小街镇');
    insert into t2 values(5,'淮上区','小蚌埠镇');
    insert into t2 values(1,'光明新区','公明街道');
    insert into t2 values(2,'光明新区','光明街道');
    insert into t2 values(1,'吉利区','大庆路街道');
    insert into t2 values(2,'吉利区','吉利乡');
    复制代码

     

    根据不同的SQL版本,可以有以下方法:

    一、SQL 2000 不支持FOR XML,不支持CONCAT。只能写自定义函数。

    复制代码
    CREATE FUNCTION dbo.townconcat(@district nvarchar(255)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + town FROM t2 WHERE district=@district 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECt district, town = dbo.townconcat(district) FROM t2 GROUP BY district 
    
    drop function dbo.townconcat
    go
    复制代码

    二、SQL 2012 支持 concat,2000版本自定义函数的基础上可少量优化

    复制代码
    --将2000版中的
    SELECT @str = @str + ',' + town FROM t2 WHERE district=@district
    --变成
    SELECT @str = concat(@str,',',town) FROM t2 WHERE district=@district 
    
    其他代码不变
    复制代码


    三、SQL2005支持for xml,可以大量简化

    select distinct a.district,
    (SELECT town+','FROM t2 where district=a.district FOR XML PATH(''))as towns 
    from t2 a

     

    以上三种方法都可以实现同样的效果。效果第一段的需求中的效果。

     

    四、分析:
    以上3种方法各有优劣,个人喜欢for xml的方式,因为够简单,一条select解决,可以直接适用于各视图中。

    核心的代码是:

    SELECT town+','FROM t2  FOR XML PATH('')

    上面的代码得到的结果为:

    注:
    1、上图中的列名是自动生成的,不可以通过as 来命名。
    2、我们不可以select多列,比如SELECT district,town+',' as tt FROM t2  FOR XML PATH('')。

    如果加上,并不会报错,但效果可能不是我们想要的,如下图:

     

    那我们如何根据关键字段来分组呢,我们可以把(select ..FOR XML..)作为子查询生成字段,看下图:

    得到上图就明白了吧,直接用distinct就可以了,见三。

     

    ---------------------------------------------

    附录

    两种sql 方式:

    第一种:  select distinct a.type,
    (SELECT title+','FROM wk_CarInfo where type=a.type FOR XML PATH(''))as towns 
    from wk_CarInfo a
    
    ------------------
    第二种,性能高:SELECT  type ,STUFF((SELECT title+',' FROM wk_CarInfo 
     WHERE t_u.type=type order by title
    FOR XML PATH('')),1,0,'') AS title
    FROM  wk_CarInfo as t_u
    GROUP BY type

     

    转载于:https://www.cnblogs.com/flysem/p/10282205.html

    展开全文
  • 最近做项目的时候有一个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一的Country不同,所以会显示数据,现打算把具有相同ID的不同Country合并成一数据,并显示该ID对应的所有的Country。...

    最近做项目的时候有一个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一列的Country不同,所以会显示多条数据,现打算把具有相同ID的不同Country合并成一条数据,并显示该ID对应的所有的Country。

    实现之前的效果是:

         

    欲实现的效果是(此处的分隔符 ‘/’ 可以替换成想要的字符):

     

    现列举数据库的三个表关系如下:

    接下来介绍一下实现的存储过程:

     1 USE [LenovoChecklist]
     2 GO
     3 /****** Object:  StoredProcedure [dbo].[PROC_yangzehuatest]    Script Date: 03/12/2014 11:18:33 ******/
     4 SET ANSI_NULLS ON
     5 GO
     6 SET QUOTED_IDENTIFIER ON
     7 GO
     8 
     9 ALTER PROCEDURE [dbo].[PROC_yangzehuatest]
    10     
    11     @projectid int 
    12     --@AllNames nvarchar(500) = '' output --此注释部分可以供其他sql语句调用,在项目中暂时没用到
    13 AS
    14 BEGIN
    15 
    16 --声明变量
    17     declare @countrynames nvarchar(500) ;
    18     set @countrynames='';
    19     declare @tempname nvarchar(50);    
    20     
    21 --声明临时表
    22    declare @temptable TABLE
    23    (
    24    tempid int identity(1,1),
    25    pro_id int ,
    26    ProjectName nvarchar (50),
    27    CountryName nvarchar(50)
    28    ) ;
    29     
    30 --插入临时表                
    31      Insert into @temptable (pro_id, ProjectName,CountryName) 
    32      SELECT CL_Project.ProjectID, CL_Project.ProjectName,CL_Country.CountryName                
    33      FROM         CL_Country INNER JOIN
    34           CL_ProjectCountry ON CL_Country.CountryID = CL_ProjectCountry.CountryID INNER JOIN
    35           CL_Project ON CL_ProjectCountry.ProjectID = CL_Project.ProjectID
    36      where CL_Project.ProjectID =@projectid 
    37                                                      
    38 --遍历临时表
    39       while exists(select CountryName from @temptable where pro_id=@projectid)
    40       begin
    41           --获取CountryName并拼接到@countrynames                     
    42           set  @tempname = (select top(1) CountryName from @temptable  where pro_id=@projectid);
    43           set @countrynames=@countrynames+'/'+@tempname; 
    44           --遍历过一条之后删除该条数据,继续遍历                    
    45           delete @temptable   where tempid=(Select top (1) tempid from @temptable);
    46       end
    47       
    48 --删除第一个'/'
    49       if (LEN(@countrynames)>1)
    50       set @countrynames=SUBSTRING(@countrynames,2,LEN(@countrynames)-1);
    51       else
    52       set @countrynames='no country';
    53       
    54       select @projectid as ProjectID, @countrynames as CountryName ;
    55       -- set @AllNames=@countrynames; --此注释部分可以供其他sql语句调用,在项目中暂时没用到
    56                       
    57    
    58 END

     

    至此,希望有所帮助。

     

     

    转载于:https://www.cnblogs.com/yangzehua/p/3596396.html

    展开全文
  • 第二是要求把指定目录下个结构相同的excel合并为一个sheet,并在合并后的sheet添加一,标识数据来源与哪一个sheet,来自同一数据源的多行数据第一要求合并单元格。 个excel合并的效果: import os ...

    最近有两个需求,第一是要求把指定目录下多个结构相同的excel合并为一个excel,每个excel都对应合并后的一个sheet;第二是要求把指定目录下多个结构相同的excel合并为一个sheet,并在合并后的sheet添加一列,标识数据来源与哪一个sheet,来自同一数据源的多行数据第一列要求合并单元格。

    • 多个excel合并的效果:

    image

    image

    import os
    import pandas as pd
    import xlwt
    
    import xlrd
    from xlutils.copy import copy
    import sys
    
    # 要写入的excel全路径及名称
    file_to = sys.argv[1]
    # 要合并的excel的目录
    rootdir = sys.argv[2]
    # 要合并的excel文件名的公共部分
    file_name = sys.argv[3]
    
    
    # 新建列表,存放文件名
    filename_excel = []
    
    
    # 列出文件夹下所有的目录与文件
    def list_all_files(rootdir):
        _files = []
        list = os.listdir(rootdir)
        for i in range(0, len(list)):
            path = os.path.join(rootdir, list[i])
            if os.path.isdir(path):
                _files.extend(list_all_files(path))
            if os.path.isfile(path):
                _files.append(path)
        return _files
    
    
    # 获取指定的文件名和要写入的sheet名
    def get_file(files, file_name):
        # 存放该excel的list
        file_list = []
        # 存放文件去除后缀名的list
        file_name_list = []
        for file in files:
            # 判断此文件名称是否包含此关键名称
            if file_name in file:
                file_list.append(file)
                print(file)
                # 截取要写入的sheet名(此处截取的规则是:截取最后一个'/'之后,'.'之前,')'之后)
                # /Users/ywq/Downloads/工作/温检/数据/市/2018年12月-2019年11月/050101_[1]合计_地区分布(行)_[27]结案、提出抗诉(件)(温州2018年12月-2019年11月).xlsx
                # 结案、提出抗诉(件)(温州2018年12月-2019年11月)
                file_name_list.append(file.split('/')[-1].split('.')[0].split(')')[1])
        return file_list, file_name_list
    
    
    def merge_files(file_to, files, file_names):
        # 创建sheet
        workbook = xlwt.Workbook()
        for file_name in file_names:
            workbook.add_sheet(file_name, cell_overwrite_ok=True)
            # print(file_name)
            # print(files[file_names.index(file_name)])
            workbook.save(file_to)
    
        # 向不同sheet写入数据
        writer = pd.ExcelWriter(file_to)
        for file_name in file_names:
            df = pd.read_excel(files[file_names.index(file_name)])
            # print(df.columns)
            # df.rename(columns={'Unnamed: 0': ''})
            df.to_excel(writer, sheet_name=file_name, startcol=0, index=False)
        writer.save()
    
    
        rb = xlrd.open_workbook(file_to, formatting_info=True)
        wb = copy(rb)
        # 修改第一个cell的值('Unnamed: 0' -> '')   这个步骤可根据实际情况选择
        for file_name in file_names:
            ws = wb.get_sheet(file_name)
            ws.write(0, 0, '')
        wb.save(file_to)
    
    files, file_names = get_file(list_all_files(rootdir), file_name)
    merge_files(file_to, files, file_names)
    
    
    • 多个sheet合并成一个sheet的效果:

    image

    image

    import os
    from openpyxl import load_workbook
    import pandas as pd
    import sys
    
    # # 要写入的excel全路径及名称
    # file_to = sys.argv[1]
    # # 要合并的excel的目录
    # rootdir = sys.argv[2]
    # # 要合并的excel文件名的标识
    # file_name = sys.argv[3]
    
    # 新建列表,存放文件名
    filename_excel = []
    
    
    # 列出文件夹下所有的目录与文件
    def list_all_files(rootdir):
        _files = []
        list = os.listdir(rootdir)
        for i in range(0, len(list)):
            path = os.path.join(rootdir, list[i])
            if os.path.isdir(path):
                _files.extend(list_all_files(path))
            if os.path.isfile(path):
                _files.append(path)
        return _files
    
    
    # 获取指定的文件
    def get_file(files, file_name_list):
        file_list = []
    
        for file_name in files:
            flag = 1
            # 判断此文件名称是否包含此关键名称
            for i in file_name_list:
                if i not in file_name:
                    flag = 0
            if flag == 1:
                file_list.append(file_name)
        return file_list
    
    
    # for i in list:
    #     print(i)
    
    #  合并第一列单元格
    def merge_cell(result_file, sheet_name):
        wb = load_workbook(result_file)
        ws = wb[sheet_name]
    
        # 获取第一列数据
        type_list = []
        i = 2
        while True:
            r = ws.cell(i, 1).value
            if r:
                type_list.append(r)
            else:
                break
            i += 1
    
        # 判断合并单元格的始末位置
        s = 0
        e = 0
        flag = type_list[0]
        for i in range(len(type_list)):
            if type_list[i] != flag:
                flag = type_list[i]
                e = i - 1
                if e >= s:
                    ws.merge_cells("A" + str(s + 2) + ":A" + str(e + 2))
                    s = e + 1
            if i == len(type_list) - 1:
                e = i
                ws.merge_cells("A" + str(s + 2) + ":A" + str(e + 2))
        wb.save(result_file)
    
    
    def merge_files(file_list, file_to):
        frames = []
        for i in file_list:
            index_list = []
            df = pd.read_excel(i,dtype=str)
            for num in range(0, df.shape[0]):
                # 可根据实际需求获取第一列的字段名称
                index_list.append(i.split('/')[-1].split('.')[0])
    
            # 在第一列插入数据来源文件名
            df.insert(0, '文件', index_list)
            filename_excel.append(i)
            frames.append(df)
    
        # 合并所有数据
        result = pd.concat(frames, axis=0)
        result.to_excel(file_to, sheet_name='merge')
    
        # 去掉第一列无用数据
        wb = load_workbook(file_to)
        ws = wb.active
        ws.delete_cols(1)
        wb.save(file_to)
    
        # 按照第一列合并相同单元格
        merge_cell(file_to, 'merge')
    
        
        # 修改此时第一行第二列cell的值('Unnamed: 0' -> '')
        rb = xlrd.open_workbook(file_to)
        wb = copy(rb)
        ws = wb.get_sheet('merge')
        ws.write(0, 1, '')
        wb.save(file_to)
    
    
    list = get_file(list_all_files(rootdir), file_name)
    merge_files(list, file_to)
    os.rename(file_to, file_to[:-1])
    
    展开全文
  • 如果将多行多列数据合并成一列?如下图所示的数据:     这个方法最开始是从EH微博上看到的,这里特意添加了空白单元格,把处理情况稍微复杂一点,如果你的数据没有空白单元格,那就自然更简单了。 先说一下...
  • 绝对有用的excel 合并 ,两列或者多列合并成一行,多行合并成一列
  • Oracle将一列分成多列Oracle将一列分成多列在Oracle中,我们可以使用listagg(Oracle 11g及以上)将多行合并成中的某一列合并成一列,现在我们的需求是将一列分割成多列。先建立一张表,插入测试数据:CREATE TABLE ...
  • Oracle将一列分成多列

    万次阅读 2015-05-11 23:50:59
    Oracle将一列分成多列在Oracle中,我们可以使用listagg(Oracle 11g及以上)将多行合并成中的某一列合并成一列,现在我们的需求是将一列分割成多列。先建立一张表,插入测试数据:CREATE TABLE CELEBRITY( NAME ...
  • hivesql:行列转换

    2021-03-12 18:42:12
    1.行转列(将多行数据合并成一列) 1.1源表person_info: name constellation blood_type 张三 白羊座 A 李四 射手座 A 王五 白羊座 B 赵六 白羊座 A 刘七 射手座 A 1.2需求:把星座和血型一样的人...
  • concat: 即将一行数据 中的 多列数据合并成一列 数据 group_concat:将 多行数据的某列 合并成一行且一列数据 concat不需要用到group by关键字 group_concat必须用到group by关键字,否则报错 group_concat...
  • Kettle 系列随笔

    2018-06-01 09:28:00
    3.Kettle 行列互换之——行转列(多列数据合并成一列变为多行) 4.Kettle 值映射 5.Kettle配合Windows执行计划实现定时实行作业 6.Kettle 解决数据锁的问题(事务(进程 ID 51)与另一个进程被死锁在 锁 资源上) ...
  • Mysql优化策略

    2020-10-26 17:51:00
    一、实践中如何优化SQL 1.1 插入数据时以主键顺序插入 ...如果需要对一张表同时插入多行数据,应该尽量使用一条sql语句进行插入,避免用条sql语句插入多行数据,这样可以大大地缩减客户端与数据库之间的连接,..
  • 技巧88 多列数据合并成一列 技巧89 运用文本运算符&或函数合并数据 技巧90 多行数据合并成一行 技巧91 行列区域直接转换 技巧92 多行多列数据转为单列数据 技巧93 单列数据转为多行多列数据 技巧94 ...
  • 1. DataFrame一次增加多列 2. Python实现分层抽样 3.把几个DataFrame合并成一个DataFrame 4. 保存多个DataFrame到一个excel里 5. Excel的列宽自动调整 6. 用Office自动打开excel文件 7. 读取excel文件路径中带...
  • 要实现的功能是 条数据,有个相同的主ID,有字段 a, b, c首先将abc散列数据合并成一列,再将多行数据根据ID,合并成一行 具体如下: OrderID MainID A B C 1 1 你 好 啊 2 1 朋 友 ...
  • 作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等个方面。读者可以学习到以下几个方面的技巧:...
  • 作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等个方面。读者可以学习到以下几个方面的技巧:...
  • 实例156 限制多行文本域输入的字符个数 187 实例157 设置文本框的只读属性 188 实例158 自动计算金额 189 实例159 为文本框设置默认值 190 实例160 设置文本框的样式 191 实例161 文本域的滚动条 192 3.3 下拉列表的...
  • 实例156 限制多行文本域输入的字符个数 187 实例157 设置文本框的只读属性 188 实例158 自动计算金额 189 实例159 为文本框设置默认值 190 实例160 设置文本框的样式 191 实例161 文本域的滚动条 192 3.3 下拉列表的...

空空如也

空空如也

1
收藏数 20
精华内容 8
关键字:

多列多行数据合并成一列