zoukankan      html  css  js  c++  java
  • 有关oracle数据库中多行转换成一行的问题

    第一步

    首先创建一个表格

    View Code
    1 CREATE TABLE TestTitle (
    2 
    3 name   VARCHAR(10),
    4 
    5 titleVARCHAR(10)
    6 
    7 );

    第二步
    插入测试数据

    View Code
    1 INSERT INTO TestTitle VALUES ('张三', '程序员');
    2 INSERT INTO TestTitle VALUES ('张三', '系统管理员');
    3 INSERT INTO TestTitle VALUES ('张三', '网络管理员');
    4 INSERT INTO TestTitle VALUES ('李四', '项目经理');
    5 INSERT INTO TestTitle VALUES ('李四', '系统分析员');

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

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

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

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

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

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

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

    View Code
     1 SELECT
     2 
     3 ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
     4 
     5 name,
     6 
     7 title
     8 
     9 FROM
    10 
    11 TestTitle
    12 
    13 ORDER BY
    14 
    15 name,
    16 
    17 title

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

    View Code
     1 SELECT
     2 
     3 name,
     4 
     5 CASE WHEN COUNT(title) = 1 THEN MAX(title)
     6 
     7        WHEN COUNT(title) = 2 THEN
     8 
     9          MAX( CASE WHEN SubQuery.no = 1 THEN title + '' ELSE '' END )
    10 
    11          + MAX( CASE WHEN SubQuery.no = 2 THEN titleELSE '' END )
    12 
    13        WHEN COUNT(title) = 3 THEN
    14 
    15          MAX( CASE WHEN SubQuery.no = 1 THEN title + '' ELSE '' END )
    16 
    17          + MAX( CASE WHEN SubQuery.no = 2 THEN title + ''ELSE '' END )
    18 
    19          + MAX( CASE WHEN SubQuery.no = 3 THEN titleELSE '' END )
    20 
    21 END AS new_title
    22 
    23 FROM
    24 
    25 (
    26 
    27 SELECT
    28 
    29     ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
    30 
    31     name,
    32 
    33     title
    34 
    35 FROM
    36 
    37     TestTitle
    38 
    39 ) subQuery
    40 
    41 GROUP BY
    42 
    43 name

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

     SELECT name,WMSYS.WM_CONCAT(title) AS allTitle FROM TestTitle GROUP BY name;

  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/wsl2011/p/2485425.html
Copyright © 2011-2022 走看看