Sql 从表中选择行到列
如何简单地从值列中选择行,以获得包含6列和2行的二维表 以下是源表:Sql 从表中选择行到列,sql,oracle,select,group-by,pivot,Sql,Oracle,Select,Group By,Pivot,如何简单地从值列中选择行,以获得包含6列和2行的二维表 以下是源表: 在固定列集合上透视表的典型解决方案是使用条件聚合: select row_idx, max(case when col_idx = 1 then value end) col1, max(case when col_idx = 2 then value end) col2, max(case when col_idx = 3 then value end) col3, max(case
在固定列集合上透视表的典型解决方案是使用条件聚合:
select
row_idx,
max(case when col_idx = 1 then value end) col1,
max(case when col_idx = 2 then value end) col2,
max(case when col_idx = 3 then value end) col3,
max(case when col_idx = 4 then value end) col4,
max(case when col_idx = 5 then value end) col5,
max(case when col_idx = 6 then value end) col6
from mytable
group by row_idx
order by row_idx
下面是一个使用SQLPivot的解决方案 如何创建示例数据集:
IF OBJECT_ID('SourceTable') Is Not Null Drop Table SourceTable
Create Table SourceTable (
COL_IDX int,
ROW_IDX int,
VALUE nvarchar(100)
)
Insert into SourceTable (COL_IDX, ROW_IDX, VALUE)
Values
(1,1,'after 45 min')
,(2,1,'98')
,(3,1,'95')
,(4,1,'99')
,(5,1,'1.1')
,(6,1,'12')
,(1,2,'after 60 min')
,(2,2,'98')
,(3,2,'96')
,(4,2,'101')
,(5,2,'1.4')
,(6,2,'12')
如何透视数据:
SELECT ROW_IDX AS MyIndex, [1],[2],[3],[4],[5],[6]
FROM
(SELECT * FROM SourceTable) AS q
PIVOT (
MAX(Value)
FOR COL_IDX IN ([1],[2],[3],[4],[5],[6])
) AS PivotedTable
结果:
MyIndex 1 2 3 4 5 6
1 after 45 min 98 95 99 1.1 12
2 after 60 min 98 96 101 1.4 12
SQL中的pivot使用聚合函数;这里我使用了“max”,但这并不重要,因为一个ROW\u IDX/COL\u IDX组合没有多个值
听起来您可能需要动态生成列,在这种情况下,您可以使用动态SQL获得相同的结果:
DROP TABLE IF EXISTS #headings
SELECT DISTINCT COL_IDX='[' + Cast(COL_IDX AS NVARCHAR(6)) + ']'
INTO #headings
FROM SourceTable
DECLARE @Columns nvarchar(1000) = (SELECT string_agg(COL_IDX, ', ') FROM #headings)
DECLARE @MyCommand nvarchar(max) =
'SELECT *
FROM SourceTable
PIVOT (
MAX(VALUE)
FOR COL_IDX IN (~Columns~)
) PivotTable'
SET @MyCommand = Replace(@MyCommand, '~Columns~', @Columns)
EXEC (@MyCommand)
DROP TABLE IF EXISTS #headings
请用您正在使用的数据库标记您的问题:mysql、oracle、sql server…?请参阅“pivot”语法如果一组列和行在所有情况下都不固定,该怎么办?还有更通用的解决方案吗?我不太熟悉Oracle中的pivot语法。@GregB:行数并不重要。但对于列:在标准SQL中,查询必须返回固定的预定义列数,因此不能基于数据动态创建列。这需要动态SQL,这要复杂得多。@GregB:请注意,上述条件聚合技术不是特定于Oracle的。这是标准SQL,可以在大多数数据库上正常运行。@GregB如果列和行的集合不是在所有情况下都是固定的,那么这里的第二个选项将适用于您。第二个选项是否有效的Oracle SQL语法?很好,@GMB。我不确定;我一开始就知道我们在谈论甲骨文。当引入
STRING\u AGG
时,这对Microsoft SQL Server 2017有效,但至少从2008年起,您可以使用作为XML路径
而不是标题来完成相同的动态透视。Oracle似乎支持类似语法的动态查询,但我不知道需要翻译什么。