SQL Server 2016中如何将两行合并为一行多字段
解决SQL Server 2016中行转列合并数据的问题
针对你需要把Direction为S和R的两行数据合并成单行的需求,在SQL Server 2016里有两种常用的实现方式,下面一步步给你演示:
方法一:条件聚合(直观易上手)
这种方法通过CASE语句配合聚合函数(这里用MAX或SUM都可以,因为每个分组下对应方向仅一条数据),把行数据转成列展示:
IF OBJECT_ID('tempdb.dbo.#MyTable') IS NOT NULL DROP TABLE #MyTable CREATE TABLE #MyTable ( Direction varchar(1), DateKey int, ID varchar(8), [Sessions] int ) INSERT INTO #MyTable VALUES('S', 20180301, 'ID123456', 46) INSERT INTO #MyTable VALUES('R', 20180301, 'ID123456', 99) -- 核心合并查询 SELECT DateKey, ID, MAX(CASE WHEN Direction = 'S' THEN [Sessions] END) AS S_Sessions, MAX(CASE WHEN Direction = 'R' THEN [Sessions] END) AS R_Sessions FROM #MyTable GROUP BY DateKey, ID
方法二:使用PIVOT函数
SQL Server的PIVOT运算符专门用于行转列场景,语法更简洁:
IF OBJECT_ID('tempdb.dbo.#MyTable') IS NOT NULL DROP TABLE #MyTable CREATE TABLE #MyTable ( Direction varchar(1), DateKey int, ID varchar(8), [Sessions] int ) INSERT INTO #MyTable VALUES('S', 20180301, 'ID123456', 46) INSERT INTO #MyTable VALUES('R', 20180301, 'ID123456', 99) -- 核心合并查询 SELECT DateKey, ID, [S] AS S_Sessions, [R] AS R_Sessions FROM #MyTable PIVOT ( MAX([Sessions]) FOR Direction IN ([S], [R]) ) AS PivotTable
最终合并结果
两种方法都会得到你想要的单行输出:
| DateKey | ID | S_Sessions | R_Sessions |
|---|---|---|---|
| 20180301 | ID123456 | 46 | 99 |
小提示:如果同一个DateKey+ID组合下存在多条同方向的数据,把聚合函数换成SUM就能自动汇总会话数啦。
内容的提问来源于stack exchange,提问作者SBF
相关产品推荐
相关产品推荐

