Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 Pivot仅前N行_Sql_Sql Server_Sql Server 2005_Tsql_Pivot - Fatal编程技术网

Sql Pivot仅前N行

Sql Pivot仅前N行,sql,sql-server,sql-server-2005,tsql,pivot,Sql,Sql Server,Sql Server 2005,Tsql,Pivot,我有以下结构 Col1 Col2 Col3 --------------- F P R1 F P R2 F P R3 F P R4 Col3值可以是任何东西 现在我只想在下面的格式前3名 Col1 Col2 Res1 Res2 Res3 ------------------------------ F P R1 R2 R3 您可以执行以下操作: SELECT Col1, Col2, MAX(CASE

我有以下结构

Col1 Col2 Col3  
---------------
F     P    R1
F     P    R2
F     P    R3
F     P    R4
Col3值可以是任何东西 现在我只想在下面的格式前3名

Col1 Col2 Res1 Res2 Res3  
------------------------------
F     P    R1   R2   R3

您可以执行以下操作:

SELECT Col1, Col2,
    MAX(CASE Col3 WHEN 'R1' THEN 'R1' END) as Res1,
    MAX(CASE Col3 WHEN 'R2' THEN 'R2' END) as Res2,
    MAX(CASE Col3 WHEN 'R3' THEN 'R3' END) as Res3
FROM MyTable
GROUP BY Col1, Col2

如果使用SQL Server 2005+、Oracle 8i+、PostgreSQL 8.4+--则可以使用分析函数:

  SELECT x.col1, x.col2,
         MAX(CASE WHEN x.rk = 1 THEN x.col3 END) AS Res1,
         MAX(CASE WHEN x.rk = 2 THEN x.col3 END) AS Res2,
         MAX(CASE WHEN x.rk = 3 THEN x.col3 END) AS Res3
    FROM (SELECT yt.col1,
                 yt.col2,
                 yt.col3,
                 ROW_NUMBER() OVER(PARTITION BY yt.col1, yt.col2
                                       ORDER BY yt.col3) AS rk
            FROM YOUR_TABLE yt) x
GROUP BY x.col1, x.col2

您寻求的是一个动态交叉表查询,它将用Col3中的值构建列。SQL语言不是为动态列生成而设计的,因此,如果没有一些富于动态的SQL,这种类型的查询无法在T-SQL中完成。相反,我建议您在中间层组件中构建查询或使用报告工具。

Col3值不是静态的,可以是任何东西。为了示例起见,我在这里提到了它。我使用的是sql 2005。我使用的是excel的SSRS报表2005。我尝试过使用Matrix。问题是如何独立显示Res1、Res2和Res3,以便用户可以选择在excel中排序。@user420054-下面是一篇关于使用SSRS Matrix进行类似操作的文章@user420054-当然,另一种方法是编写构建查询的代码。SSRS不是我的专长,但我希望有一种方法可以注入一些自定义代码,使用对db的调用构建查询,然后将该查询传递给SSRS包的其余部分。然而,你又一次超出了我在SSRS方面的专业领域。您可以考虑使用SSR打开与矩阵组件相关的新情况,因为TAG.OP已经打开了这样一个问题,这里:后来我提出了一个答案。我还开了一张新票,马克对此有答案。我并没有验证它,因为我能够解析sql,也并没有使用Matrix,而是使用Table,它看起来相当快。非常感谢one and all.Ty,它可以工作,而且我也尝试在SSRS中实现同样的功能。@user420054:我使用SSRS,但我总是使用存储过程--抱歉,不是matrix/etc。