行变列
思韵闪耀
2010-10-01
0
行变列

    注:要变列的行单元对应的数据须唯一,故在下面的子查询中先对目标行单元进行了分组,以保证唯一性。
    1,用case指定条件
    SELECT f.UserName,
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-10' THEN b.Amount ELSE 0  END) AS '2011-03-10',
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-11' THEN b.Amount  ELSE 0 END) AS '2011-03-11',
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-12' THEN b.Amount  ELSE 0 END) AS '2011-03-12'
    FROM bdAchievement a(NOLOCK)
    JOIN bdOrder b(NOLOCK) ON a.OrderNo = b.OrderNo
    JOIN frmuser f ON a.SalesStaff = f.Account
    WHERE a.RootDepartmentID  = 184 AND b.OrderDate >='2011-03-10'
    GROUP BY F.UserName

    2,用SQL SERVER2005提供的关键词PIVOT来执行
    行变列:将多行的值合并放到列上去,这就需要一个聚合函数,此外要指定拆分成行(列一行)的列并且此列按如何规则分配到行上去
    SELECT * FROM (
    SELECT f.UserName,CONVERT(VARCHAR(10),OrderDate,120) orderdate,b.Amount
    FROM bdAchievement a(NOLOCK)
    JOIN bdOrder b(NOLOCK) ON a.OrderNo = b.OrderNo
    JOIN frmuser f ON a.SalesStaff = f.Account
    WHERE a.RootDepartmentID  = 3 AND b.OrderDate >='2010-02-10') O
    PIVOT (SUM(amount) FOR orderdate IN([2011-03-10],[2011-03-11],[2011-03-12],[2011-03-13])) AS c
    将列订单日期转换到行上去,分成多个列,规则是[2011-03-10],[2011-03-11],[2011-03-12],[2011-03-13]),并对要求的amount求和

    同样列变行为:UNPIVOT
注:应用限制,列拆分规则是有限的几个,即行名是可指定的,若行名是未知数,那查出的数据将不知放到哪一列,故这样的行转列是则不可执行

注: PIVOT 与CASE 方法的区别:PIVOT简洁,但只能将一个列的列值转为列,没有CASE灵活

3,将列直接转成行
现有一客户电话表,客户电话最多4个,要求以行形式显示出来

CREATE TABLE tmpTable(CustomerID INT,Tel VARCHAR(20))

INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654321')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654322')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654323')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654324')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(333,'13587654331')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(333,'13587654332')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654341')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654332')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654332')

SELECT * FROM (
SELECT customerid,tel, ROW_NUMBER () OVER ( PARTITION BY CustomerID ORDER BY  tel DESC )r
FROM tmpTable tt)m
PIVOT (max(tel) FOR r IN ([1],[2],[3],[4]) ) AS t


【版权声明】
本站部分内容来源于互联网,本站不拥有所有权,不承担相关法律责任。如果发现本站有侵权的内容,欢迎发送邮件至masing@13sy.com 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

相关内容

网页保护、网页图片保护
1、禁止另存网页,把如下代码加入到网页body/body中 程序代...
2025-05-30
SQLSERVER】批量导...
1.在Microsoft SQL Server Managemen...
2025-05-15
SqlServer 数据库...
--查看数据库大小SELECT DB_NAME(database_...
2024-09-03
docker-compos...
1.Compose介绍 DockerCompose是一个用来定义和...
2024-04-26
Mysqldump 时出现...
Mysqldump 时出现错误及解决方案:mysqldump: C...
2024-01-16
MySQL数据库”mysq...
MySQL数据库”mysql SQL Error:1146,SQL...
2023-12-02

热门资讯

sql中int型与varcha... sql中int转varchar或nvarchar,varchar或nvarchar转int的方法: ...
SQLSERVERAGENT ... 上的 SQLSERVERAGENT 服务启动过,然后又停止了。 (ObjectExplorer) 可...
SQL Server 中4个系... SQL Server 中4个系统数据库,Master、Model、Msdb、Tempdb 系统数据库...
SQL Server中如何设置... 对于已经建好的数据库表,是不能在SQL Server Management中可视化地修改ID为自增长...
该表已为了复制而被发布,所以... 场景:从发布库上将一数据库移到另一服务器,在对表改名时提示该表已为了复制而被发布,所以无法重命名。 ...
SQL Server 2008... SQL Server 2008 R2运行越久,占用内存会越来越大。 第一种: 有了上边的分析结果,解...
SQL Server (MSS... SQL Server (MSSQLSERVER) 启动后 自动生成文件 audittrace2022...
如果使用没有提供选项值的 Sq... 如果使用没有提供选项值的 SqlDependency,必须先调用 SqlDependency.Sta...
传递给数据库 'master'... 传递给数据库 master 中的日志扫描操作的日志扫描号无效 错误:连接数据库的时候提示:SQL S...
数据仓库SSAS+SSIS+... 数据仓库SSAS+SSIS+SSRS SSAS- 1,用ssas生成多维度,然后利用excel的da...