将部分相同的多行记录转成一行多列

数据库环境:SQL SERVER2008R2

需求如下图:

简单解释一下需求,将同一年月的多行转到一行,分别展示每个用户的信息,在最后分别对前面数量和金额进行合计。

这其实又是行列转换的一个应用,下面直接贴SQL

/*数据准备*/
WITH    x0
          AS ( SELECT   CONVERT(DATE, ‘2015-01-01‘) AS 日期 ,
                        N‘小1‘ AS 姓名 ,
                        100 AS 数量 ,
                        1000 AS 金额
               UNION ALL
               SELECT   CONVERT(DATE, ‘2015-01-01‘) AS 日期 ,
                        N‘小2‘ AS 姓名 ,
                        200 AS 数量 ,
                        2100 AS 金额
               UNION ALL
               SELECT   CONVERT(DATE, ‘2015-01-02‘) AS 日期 ,
                        N‘小3‘ AS 姓名 ,
                        300 AS 数量 ,
                        4000 AS 金额
               UNION ALL
               SELECT   CONVERT(DATE, ‘2015-01-02‘) AS 日期 ,
                        N‘小4‘ AS 姓名 ,
                        600 AS 数量 ,
                        7000 AS 金额
               UNION ALL
               SELECT   CONVERT(DATE, ‘2015-01-02‘) AS 日期 ,
                        N‘小4‘ AS 姓名 ,
                        700 AS 数量 ,
                        8000 AS 金额
               UNION ALL
               SELECT   CONVERT(DATE, ‘2015-01-02‘) AS 日期 ,
                        N‘小5‘ AS 姓名 ,
                        500 AS 数量 ,
                        4600 AS 金额
             ),/*将同一人的信息合并*/
        x1
          AS ( SELECT   日期 ,
                        姓名 ,
                        SUM(数量) AS 数量 ,
                        SUM(金额) AS 金额
               FROM     x0
               GROUP BY 日期 ,
                        姓名
             )
    /*将基础数据插入到临时表*/
    SELECT  a.日期 ,
            a.姓名 ,
            a.数量 ,
            a.金额 ,
            ROW_NUMBER() OVER ( PARTITION BY a.日期 ORDER BY a.姓名 ) 序号
    INTO    #t
    FROM    x1 a
/*拼接SQL,实现动态行列转换*/
DECLARE @sql NVARCHAR(MAX);
SET @sql = N‘‘;
SELECT  @sql = @sql + N‘,max(case 序号 when ‘ + CAST(tt.序号 AS VARCHAR)
        + N‘ then 姓名 else null end) 姓名‘ + N‘,max(case 序号 when ‘
        + CAST(tt.序号 AS VARCHAR) + N‘ then 数量 else null end) 数量‘
        + N‘,max(case 序号 when ‘ + CAST(tt.序号 AS VARCHAR)
        + N‘ then 金额 else null end) 金额‘
FROM    ( SELECT DISTINCT
                    序号
          FROM      #t
        ) tt
ORDER BY 序号;
SET @sql = N‘select 日期‘ + @sql
    + N‘,sum(数量) as 数量合计,sum(金额) as 金额合计 from #t group by 日期‘;
EXEC(@sql);

最终实现结果截图如下

这个需求并不难,重点在掌握动态行列转换的使用。

(本文完)

时间: 2024-08-25 04:38:32

将部分相同的多行记录转成一行多列的相关文章

hive concat_w实现将多行记录合并成一行

建表如下: # 创建商品与促销活动的映射表 hive -e "set mapred.job.queue.name=pms; set hive.exec.reducers.max=32; set mapred.reduce.tasks=32; drop table if exists product_promotion; create table product_promotion(product_id bigint, promotion_id String); insert into table

SQL 将一条记录中多个字段的值拼接为一个字段 && 将多行数据合并成一行,并且拼接CONVERT() 、for xml path的使用

接着上篇文章的订单表(商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格) 一.将一条记录中多个字段的值拼接为一个字段 现要求将两个时间段合并为一个字段,应该如何做呢? 先来看下理想的结果: 查询出的时间段合并到一起了: 代码如下,将查询的字段用+'你想要的符号' + 拼接即可 select item,act_id,loc_id,convert(varchar(100),start_date,20)+ '-' +convert(varchar

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN model m 4 ON am.modelId = m.modelId 5 ORDER BY am.activeId 查询出的列表为图1所示: 图1 修改过后的sql语句,查询后如图2所示: 1 SELECT

关于SQL Server将一列的多行内容拼接成一行的问题讨论(转载)

说明:本文仅供分享,版权属于原作者. 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes  ep_name AAA         企业1 AAA         企业2 AAA         企业3 BBB         企业4 BBB         企业5 我想把这个表变成如下格式: ep_classes      ep_name AAA           

Oracle一列的多行数据拼成一行显示字符

Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数. www.2cto.com 先介绍:WMSYS.WM_CONCAT 例: id  name 1   aa 2   bb 3   cc 要的结果是"aa,bb,cc" select WMSYS.WM_CONCAT(a.name) from user a 这样的话,查询出的结果:"aa,bb,cc" www.2cto.com 分隔符如果不需要用

关于SQL Server将一列的多行内容拼接成一行的问题讨论

昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes  ep_name AAA         企业1 AAA         企业2 AAA         企业3 BBB         企业4 BBB         企业5 我想把这个表变成如下格式: ep_classes      ep_name AAA             企业1,企业2,企业3 BBB  

SQL Server将一列的多行内容拼接成一行的实现方法

SQL Server将一列的多行内容拼接成一行的实现方法 投稿:mdxy-dxy 这篇文章主要介绍了SQL Server将一列的多行内容拼接成一行的实现方法,需要的朋友可以参考下 下面大家先看下示例代码: 示例 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA 企业2 AAA 企业3 BBB 企业4 BBB 企业5 我想把这个表变成如下格式: 类别 名称

SQL Server将一列的多行内容拼接成一行

昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes  ep_name AAA         企业1 AAA         企业2 AAA         企业3 BBB         企业4 BBB         企业5 我想把这个表变成如下格式: ep_classes      ep_name AAA             企业1,企业2,企业3 BBB  

oracle查询多行数据合并成一行数据

如果是oracle 10g以上 一个wm_concat函数就可以解决. 如果是oracle 9i以下就有点麻烦了. 表结构如下: NAME Null Type ------------------------ --------- ----- N_SEC_CODE NOT NULL CHAR(6) C_RESEARCHER_CODE NOT NULL VARCHAR2(20) 此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员 对其进行跟踪研究.所以目前遇