/*=============
===fcuandy=====
===2008.1.23===
=============*/

CREATE TABLE ta(id INT IDENTITY(1,1),cid INT,name VARCHAR(10))
GO
INSERT ta SELECT 1,'a'
UNION ALL SELECT 1,'b'
UNION ALL SELECT 1,'c'
UNION ALL SELECT 2,'d'
UNION ALL SELECT 3,'e'
UNION ALL SELECT 3,'f'
GO

/*
示例 1
同一分类中取1条或n条。
单表及多表的写法
*/

-----------------------------------------------------------
--以ta为例,cid为分类id,每个id取一条,我以取最小id为约束条件
SELECT a.* FROM ta a
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)
SELECT a.* FROM ta a
    WHERE 1>(SELECT COUNT(*) FROM ta WHERE cid=a.cid AND id<a.id)

SELECT a.* FROM ta a
    WHERE id IN (SELECT TOP 1 ID FROM ta WHERE cid=a.cid ORDER BY id)
SELECT a.* FROM ta a
    WHERE id = (SELECT TOP 1 ID FROM ta WHERE cid=a.cid ORDER BY id)
SELECT a.* FROM ta a
    WHERE id IN (SELECT MIN(ID) FROM ta WHERE cid=a.cid)
SELECT a.* FROM ta a
    WHERE id = (SELECT MIN(ID) FROM ta WHERE cid=a.cid)
SELECT a.*
    FROM ta a
INNER JOIN
    (SELECT MIN(id) mi FROM ta GROUP BY cid) b
    ON id = mi
--etc.其它的组合写法再不累赘

--以cid为分类,每个cid取id最小的2条记录,2可以适当修改
SELECT a.* FROM ta a
    WHERE 2>(SELECT COUNT(*) FROM ta WHERE cid=a.cid AND id<a.id)
SELECt a.* FROM ta a
    WHERE id IN (SELECT TOP 2 ID FROM ta WHERE cid=a.cid ORDER BY ID)
SELECT a.*
    FROM ta a
INNER JOIN
    (SELECT ID,CNT=(SELECT COUNT(*) FROM ta WHERE cid=x.cid AND id<x.id) FROM ta x) b
    ON a.id = b.id AND cnt<2
--etc.其它的组合写法再不累赘

--上面是针对ta单表。 如果多表,下面以二表为例

CREATE TABLE tb(cid INT,className VARCHAR(10))
GO
INSERT tb SELECT 1,'A'
UNION ALL SELECT 2,'B'
UNION ALL SELECT 3,'C'
GO
--ta,tb以cid关联,取每个cid中id最小的一条记录,需要 tb.className,tb.cid,ta.id,ta.name列。
SELECT b.*,a.*
    FROM tb b
INNER JOIN ta a
    ON a.cid = b.cid
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)
GO
--多表与单表取数思路一对致,多一次连表操作,可以照上面单表的把其它写法改出来.
--同样,取每个cid中id最小的前n条记录,一样的方法
--需要注意的是连表时,可以用内连,左连,或是老式的多表写法(from ta ,tb where ta.cid=tb.cid默认转换为内连),采用哪种方式依具你的业务需求。

----------------------------------------------------------
/*
示例 2
所谓的多行同组合并
*/

--以ta为例,以cid分组合并,产生如下的数据结果
/*
cid     nameS
1    a,b,c
2    d
3    e,f
*/
--函数实现
CREATE FUNCTION myJoinSTR
(
@cid INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @s VARCHAR(1000)
    SELECT @s=ISNULL(@s+',','') + name FROM ta WHERE cid = @cid
    RETURN @s
END
GO
SELECT DISTINCT cid,dbo.myJoinSTR(cid) nameS FROM ta
GO

/*
示例 3
列拆分为行.
以上例生成的数据格式为示例表,将a,b,c以,分融成行,即上个示例的反操作
*/

SELECT DISTINCT cid,dbo.myJoinSTR(cid) nameS INTO tx FROM ta
GO
SELECT * FROM tx
GO
--以系统表构建identity列,并以连表方式来将列拆成行
SELECT IDENTITY(INT,1,1) id INTO # FROM syscolumns,sysobjects

SELECT id,cid,RIGHT(STUFF(nameS+',',id,LEN(names),''),CHARINDEX(',',REVERSE(STUFF(','+nameS+',',id,LEN(names),'')))) name
    FROM tx a
INNER JOIN # b
    ON SUBSTRING(names+',',id,1)=','
ORDER BY cid
--以动态语句或循环,或函数的方式略去

/*示例 4
行转列
这是论坛上问的最多的,没啥好说的,照猫画虎。
*/

--单表,以ta为例. 静态行转列,设cid所有出现的可能值已知
SELECT    
    cid_1=MAX(CASE WHEN cid=1 THEN name ELSE NULL END),
    cid_2=MAX(CASE WHEN cid=2 THEN name ELSE NULL END),
    cid_3=MAX(CASE WHEN cid=3 THEN name ELSE NULL END)
    FROM ta
--单表,以ta为例,动态行转列,设cid所有出现的可能值未知

DECLARE @s VARCHAR(8000)
SET @s=''
SELECT @s=@s + ',cid_' + RTRIM(cid) + '= MAX(CASE WHEN cid=' + RTRIM(cid) + ' THEN name ELSE null END) ' FROM ta GROUP BY cid
SELECT @s='SELECT ' + STUFF(@s,1,1,'') + ' FROM ta'
--你可以在这里PRINT @s 看看,就知道跟上面的静态行转列一样的了。 会写静态行转列,就没理由写不出动态的。多表的同理,把多表的静态行转列写出来,那么动态的也就出来了
EXEC(@s)
GO

DROP TABLE tx,#
GO

DROP TABLE ta,tb
DROP FUNCTION myJoinSTR
GO
转自:http://topic.csdn.net/u/20080123/18/9731d130-0d4b-4c11-8d89-f2c3ca331f0c.html

转载于:https://www.cnblogs.com/haoqiang/archive/2009/12/01/1614374.html

SQL 行转列,列分行,行合并列(转)相关推荐

  1. layui框架实现table某一列的合并+冻结(合并列+fixed冻结二者发生冲突)

    1.先实现的合并(百度上有很多),我用的是这个博主的 京兆文鱼博主的:合并列的代码 2.对1中已经完成合并的这一列进行"冻结",我用的是layui框架自带的fixed属性(不知道的 ...

  2. 多列转多行sql oracle,sql多行转多列,中文没办法聚集的有关问题

    sql多行转多列,中文没办法聚集的问题? 我要将下表 选项      答案       姓名 爱好      篮球       bruce 年龄      28        bruce 性别     ...

  3. code vs 把所有行拼接成一行_关于SQL Server将一列的多行内容拼接成一行的问题讨论...

    示例 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别名称 AAA 企业1 AAA 企 ...

  4. oracle 动态sql列转行_Oracle 行转列 动态出转换的列

    10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要转出多少个列,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来 ...

  5. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...

  6. GRIDVIEW多行多列合并单元格(合并列)

    GitHub项目地址:https://github.com/mingceng/merge-gridviewcell 去年的时候,我写了两篇文章:  GridView多行多列合并单元格(完整代码和例子) ...

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

    SQL Server将一列的多行内容拼接成一行的实现方法 投稿:mdxy-dxy 这篇文章主要介绍了SQL Server将一列的多行内容拼接成一行的实现方法,需要的朋友可以参考下 下面大家先看下示例代 ...

  8. SQL 行转列 列转行 Oracle转置函数函数pivot、unpivot 解决wm_concat 没有排序

    https://www.cnblogs.com/mellowsmile/p/4642306.html HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼. 终风且霾,惠然肯来,莫往莫来,悠悠我思. 博客园 ...

  9. sql拼接同一字段中的数据_用SQL将Oracle中同一列的多行记录拼接成一个字符

    用SQL将Oracle中同一列的多行记录拼接成一个字符串 用SQL将Oracle中同一列的多行记录拼接成一个字符串 [sql] -- 原始数据 -- a   111 -- b   222 -- a   ...

最新文章

  1. 深入浅出SharePoint2013——获取Application Pool的id和name对照表
  2. TCP/IP总结(2)基础概念
  3. 子类super调用父类函数,该函数中调用的函数是父类还子类呢
  4. nyist --- 组队赛(四)
  5. power系列服务器问题品管主任,了解 Power BI 管理员角色
  6. 307. Range Sum Query - Mutable | 307. 区域和检索 - 数组可修改(数据结构:线段树,图文详解)
  7. Warning: mysql_real_escape_string(): Access denied for user 'nobody'@'localhost'
  8. 前端:JS/20/数组(数组的概念,数组元素,数组索引,数组元素的访问,数组的长度,数组的创建方法,数组的操作,实例:使用数组保存个人信息,实例:求数组所有值的平均值,数组对象的length属性)
  9. mysql索引与事务笔记_《MySQL技术内幕:InnoDB存储引擎》读书笔记五-锁、索引及事务...
  10. 《python基础教程(第二版)》学习笔记 基础部分(第1章)
  11. Linux中shell脚本获取当前工作目录
  12. idea手动执行maven命令的三种方式
  13. bootbox.confirm 官方例子 网址
  14. 3Dmax哪个版本好用
  15. java Runtime.exec方法详解
  16. 艺术设计用计算机主板,学艺术设计的用什么电脑比较好
  17. win7下运行.php,Win7下在IIS7中配置PHP的FastCGI支持_笔记
  18. 【2023校招刷题】第二期:数字IC笔试模拟题(2)详细解析版
  19. Host文件是什么?host文件有什么作用?
  20. Javascript 返回指定日期所在星期的开始和结束时间戳,即自然周周一00:00:00.000——自然周周日23:59:59.999

热门文章

  1. 【Flink】Flink UpsertStreamTableSink requires that has a full primary keys if update
  2. 【算法】剑指 Offer 31. 栈的压入、弹出序列 【重刷】
  3. 【Spark】SparkStreaming的应用及其原理
  4. Esper事件处理引擎 EPL语法-模式匹配
  5. Java forEach() 方法的三种用法
  6. java操作浏览器_java selenium 操作浏览器实例
  7. Java并发:五种线程安全类型、线程安全的实现、枚举类型
  8. 面试官:谈谈MySQL的limit用法、逻辑分页和物理分页
  9. SpringCloud+OAuth2+Redis实现的微服务统一认证授权
  10. 2020最新,100道电商大厂必问面试题:附完整答案