Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中选择行到列_Sql_Oracle_Select_Group By_Pivot - Fatal编程技术网

Sql 从表中选择行到列

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

如何简单地从值列中选择行,以获得包含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 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似乎支持类似语法的动态查询,但我不知道需要翻译什么。