`
lixiamani
  • 浏览: 37587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL查询案例:多行转换为一行

 
阅读更多
使用通常的方式
测试表与测试数据
CREATE TABLE TestTitle (

name   VARCHAR(10),

titleVARCHAR(10)

);



INSERT INTO TestTitle VALUES ('张三', '程序员');

INSERT INTO TestTitle VALUES ('张三', '系统管理员');

INSERT INTO TestTitle VALUES ('张三', '网络管理员');


INSERT INTO TestTitle VALUES ('李四', '项目经理');

INSERT INTO TestTitle VALUES ('李四', '系统分析员');


要求
对于测试数据,要求查询结果为:

张三程序员,系统管理员,网络管理员

李四项目经理,系统分析员

这种结构的结果。


思路
简单查看这个结果,很像对字符型的GROUP BY处理。

数值类型的可以SUM,但是字符类型的无法这么处理。

只好依次MAX(1) + MAX(2) + MAX(3)这种办法来处理。



实现
第一步,设置好分组的编号

SELECT

ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,

name,

title

FROM

TestTitle

ORDER BY

name,

title


no                   name       title

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

                   1李四        系统分析员

                   2李四        项目经理

                   1张三        程序员

                   2张三        网络管理员

                   3张三        系统管理员



第二步,根据有编号的子查询,进行分组处理

SELECT

name,

CASE WHEN COUNT(title) = 1 THEN MAX(title)

       WHEN COUNT(title) = 2 THEN

         MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )

         + MAX( CASE WHEN SubQuery.no = 2 THEN titleELSE '' END )

       WHEN COUNT(title) = 3 THEN

         MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )

         + MAX( CASE WHEN SubQuery.no = 2 THEN title + ','ELSE '' END )

         + MAX( CASE WHEN SubQuery.no = 3 THEN titleELSE '' END )

END AS new_title

FROM

(

SELECT

    ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,

    name,

    title

FROM

    TestTitle

) subQuery

GROUP BY

name



执行结果

name       new_title

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

李四        系统分析员,项目经理

张三        程序员,网络管理员,系统管理员




对于SQL Server 2005 以上版本使用FOR XML的方式
测试表与测试数据要求
与前面的一样


思路
首先把一个用户的数据,单独的读取出来

然后按照分组进行处理


实现
第一步 把一个用户的数据,单独的读取出来


SELECT

',' + title

FROM

TestTitle

WHERE

name = '张三'

FOR XML PATH('')




第二步Group By每个人


SELECT

name,

STUFF(

   (

   SELECT

     ',' + title

   FROM

     TestTitle subTitle

   WHERE

     name = TestTitle.name

   FOR XML PATH('')

   ),

   1, 1, '') AS allTitle

FROM

TestTitle

GROUP BY

name


执行结果

name      allTitle

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

李四        项目经理,系统分析员

张三        程序员,系统管理员,网络管理员



对于SQL Server 2005 以上版本使用 CTE 的处理方式 (使用递归方式处理)



WITH
t1  AS
(
  SELECT
    ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS ID,
    name,
    title
  FROM
    TestTitle
),
t2 AS
(
  SELECT
    t1.id,
    t1.name,
    CAST(t1.title AS varchar(100)) AS title
  FROM
    t1
  WHERE
    t1.id = 1
  UNION ALL
  SELECT
    t1.id,
    t2.name,
    CAST( t1.title + ',' + t2.title AS varchar(100)) AS title
  FROM
    t1, t2
  WHERE
    t1.name = t2.name
    AND t1.id = (t2.id + 1)
)
SELECT
  name,
  title
FROM
  t2
WHERE
  NOT EXISTS (
    SELECT 1
    FROM t2 t22
    WHERE
      t2.name = t22.name
      AND t2.id < t22.id
  );



name       title

---------- -----------------------------------------------------------
-------------------------------
张三         系统管理员,网络管理员,程序员

李四         项目经理,系统分析员


(2 行受影响)





对于MySQL使用 GROUP_CONCAT 函数 的方式进行处理(非常简单)





mysql> SELECT
    ->   name,
    ->   GROUP_CONCAT(title) AS allTitle
    -> FROM
    ->   TestTitle
    -> GROUP BY
    ->   name;
+------+------------------------------+
| name | allTitle                     |
+------+------------------------------+
| 李四 | 项目经理,系统分析员          |
| 张三 | 程序员,系统管理员,网络管理员 |
+------+------------------------------+
2 rows in set (0.00 sec)





对于Oracle使用 WMSYS.WM_CONCAT 函数 的方式进行处理(也非常简单)



SQL>
SQL> SELECT
  2    name,
  3    WMSYS.WM_CONCAT(title) AS allTitle
  4  FROM
  5    TestTitle
  6  GROUP BY
  7    name;

NAME
----------
ALLTITLE
-------------------------------------------
李四
项目经理,系统分析员

张三
程序员,系统管理员,网络管理员



对于 DB2 ,也是使用 CTE 递归的方式处理


WITH
t1 (id, name, title) AS
(
  SELECT
    ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS ID,
    name,
    title
  FROM
    TestTitle
),
t2 (id, name, title) AS
(
  SELECT
    t1.id,
    t1.name,
    CAST(t1.title AS varchar(100)) AS title
  FROM
    t1
  WHERE
    t1.id = 1
  UNION ALL
  SELECT
    t1.id,
    t2.name,
    CAST( t1.title || ',' || t2.title AS varchar(100)) AS title
  FROM
    t1, t2
  WHERE
    t1.name = t2.name
    AND t1.id = (t2.id + 1)
)
SELECT
  name,
  title
FROM
  t2
WHERE
  NOT EXISTS (
    SELECT 1
    FROM t2 t22
    WHERE
      t2.name = t22.name
      AND t2.id < t22.id
  );



NAME       TITLE

---------- ---------------------------------------------------------------------
-------------------------------
SQL0347W  递归公共表表达式 "WZQ.T2" 可能包含无限循环。  SQLSTATE=01605

李四       项目经理,系统分析员

张三       网络管理员,系统管理员,程序员


  已选择 2 条记录,打印 1 条警告消息。


http://hi.baidu.com/wangzhiqing999/blog/item/a57d1a86009e439ff703a67a.html
分享到:
评论

相关推荐

    2层设计-2.4G RF高频信号收发模块硬件(cadence原理图+PADS PCB图+BOM)文件.zip

    2层设计-2.4G RF高频信号收发模块硬件(cadence原理图+PADS PCB图+BOM)文件,可供学习及设计参考。

    JAVA文件传输(lw+源代码).zip

    FTP(File Transfer Protocol)是文件传输协议的简称。 FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。 目前FTP服务器软件都为国外作品,例如Server_U、IIS,国内成熟的FTP服务器软件很少,有一些如(Crob FTP Server),但从功能上看来远不能和那些流行的服务器软件媲美。

    语音端点检测及其在Matlab中的实现.zip

    语音端点检测及其在Matlab中的实现.zip

    Matlab 交互式多模型目标跟踪IMM.zip

    Matlab 交互式多模型目标跟踪IMM.zip

    numpy试题(2021年整理精品文档).zip

    numpynumpy试题(2021年整理精品文档).zip

    基于Python+Django城市PM2.5空气质量数据可视化分析系统

    【作品名称】:基于Python+Django城市PM2.5空气质量数据可视化分析系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: Python基于Django城市PM2.5空气质量数据可视化分析 开发软件:Pycharm + Python3.7 + Django + Echarts + Mysql 实现目标:利用已经收集各个城市包括北京、上海、广州、成都、沈阳的PM2.5空气数据,利用python进行各种数据分析,将分析结果保存到csv文件中,然后利用django框架的网站,前端采用echart对分析的结果进行图表可视化展示。

    c#实现求解白拉修斯方程。程序使用文件流,四阶龙哥库塔法.zip

    c#实现求解白拉修斯方程。程序使用文件流,四阶龙哥库塔法

    单片机3.DSN

    单片机3.DSN

    NumPy 的用途是什么

    NumPy 的用途是什么

    Java游戏设计打飞机程序(源代码+LW).zip

    Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)Java游戏设计打飞机程序(源代码+LW)

    Java项目之企业人事工资管理系统(源码)

    Java项目之企业人事工资管理系统(源码) 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

    vb.net做的教务管理系统 功能完善 后台数据库使用的acce.zip

    vb.net做的教务管理系统 功能完善 后台数据库使用的acce.zip

    Nvidia 17.1 for win10&Win11 vGPU驱动

    Nvidia 17.1最新win10&Win11 vGPU驱动 名称:551.78_grid_win10_win11_server2022_dch_64bit_internationa

    基于物品的协同过滤推荐调用实例(C#版).zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    (文章复现)工业园区需求响应资源聚合优化配置方法matlab代码

    参考文献: [1]李明轩,齐步洋,贺大玮.工业园区需求响应资源聚合优化配置方法[J].电网技术,2022,46(09):3543-3549.DOI:10.13335/j.1000-3673.pst.2021.1666. 1.摘要 需求响应资源数量的不断提升对响应资源的优化运行方法提出了更高的要求。面向工业园区内负荷聚合商开展日内需求响应的应用场景,提出了一种资源聚合优化配置方法,即在日前时段对响应资源预先聚合优化形成一定数量满足 特定条件的聚合体,再在日内运行时段对各聚合体进行优化调用以满足电网侧需求。该方法实现对数量庞大、分散存在、特性各异的资源的灵活聚合和优化配置,充分发挥各资源响应潜力和互补特性,并通过将大量求解计算从日内转移至日前时段,平衡了响应实时性要求与计算规模的矛盾。通过算例分析验证了所提模型与方法的合理性和有效性。

    毕业设计[主机域名]HostDirector v1.01_hostdirector101.zip

    毕业设计[主机域名]HostDirector v1.01_hostdirector101.zip

    基于MATLAB的pca人脸识别.zip

    基于MATLAB的pca人脸识别.zip

    Qt+OpenCV通用视觉框架全套源码.zip.008

    Qt+OpenCV通用视觉框架全套源码.zip.008

    JAVA002打飞机游戏设计(程序+LW).zip

    JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)JAVA002打飞机游戏设计(程序+LW)

    JAVA002打飞机游戏设计(程序+lw).zip

    在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端: 1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。 2. 传统手机访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。

Global site tag (gtag.js) - Google Analytics