如何在SQL查询中将行转列?附视图数据示例
解决SQL视图的行列转置需求
针对你描述的场景,这是一个典型的**行列转置(Pivot)**需求——需要将同一Ordinamento分组下的多行数据,转换成以分组为单位的单行多列数据。下面提供两种通用的实现方案,适配大多数主流SQL数据库:
方案一:使用CASE表达式+聚合函数(兼容性最强)
这种写法不依赖数据库特定的PIVOT语法,几乎所有SQL数据库都支持:
SELECT -- 生成你期望的连续ID:从72开始递增 71 + ROW_NUMBER() OVER (ORDER BY Ordinamento) AS ID, IdEsame, -- 提取Colonna=1对应的参数值 MAX(CASE WHEN Colonna = 1 THEN IdParametro END) AS IdParametro, -- 提取Colonna=2对应的参数值 MAX(CASE WHEN Colonna = 2 THEN IdParametro END) AS IdParametro2, -- 提取Colonna=3对应的参数值 MAX(CASE WHEN Colonna = 3 THEN IdParametro END) AS IdParametro3 FROM YourViewName -- 替换成你的视图名称 WHERE IdEsame = 39 GROUP BY IdEsame, Ordinamento ORDER BY Ordinamento;
说明:
- 我们通过
GROUP BY IdEsame, Ordinamento将同一排序组的行聚合在一起; CASE表达式负责定位每个Colonna对应的IdParametro值,配合MAX(或MIN,因为每组每个Colonna只有一个值)提取出唯一值;ROW_NUMBER() OVER (ORDER BY Ordinamento)用于生成连续的序号,加上71后正好得到你期望的72、73、74的ID序列。如果需要保留原分组中Colonna=1的原始ID,只需把ID行替换为:MIN(CASE WHEN Colonna = 1 THEN ID END) AS ID
方案二:使用PIVOT语法(适用于SQL Server、Oracle等支持的数据库)
如果你的数据库支持PIVOT关键字,可以用更简洁的写法:
WITH PivotData AS ( SELECT IdEsame, Ordinamento, ID, IdParametro, -- 动态生成目标列名:IdParametro1/2/3 'IdParametro' + CAST(Colonna AS VARCHAR(10)) AS ParametroColumn FROM YourViewName WHERE IdEsame = 39 ) SELECT 71 + ROW_NUMBER() OVER (ORDER BY Ordinamento) AS ID, IdEsame, IdParametro1, IdParametro2, IdParametro3 FROM PivotData PIVOT ( MAX(IdParametro) FOR ParametroColumn IN (IdParametro1, IdParametro2, IdParametro3) ) AS PivotedResult ORDER BY Ordinamento;
说明:
- 先通过CTE(公共表表达式)将
Colonna的值转换成目标列名的后缀; - 利用PIVOT关键字直接将行数据转成列,最后生成你需要的结果集。
执行上述任意方案,都能得到你期望的结果:
| ID | IdEsame | IdParametro | IdParametro2 | IdParametro3 |
|---|---|---|---|---|
| 72 | 39 | 163 | 164 | 165 |
| 73 | 39 | 166 | 167 | 168 |
| 74 | 39 | 169 | 170 | 171 |
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

