【问题标题】:Sql Pivot top N rows onlySql Pivot 仅前 N 行
【发布时间】:2011-04-15 11:38:29
【问题描述】:

我有以下结构

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

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql pivot


    【解决方案1】:

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

    【讨论】:

    • 我将 SSRS Report 2005 用于 Excel。我尝试使用 Matrix。问题是如何独立显示 Res1、Res2 和 Res3,以便用户可以选择在 excel 中进行排序。
    • @user420054 - 这是一篇关于使用 SSRS 矩阵做类似事情的文章。 simple-talk.com/sql/reporting-services/…
    • @user420054 - 另一种方法当然是编写构建查询的代码。 SSRS 不是我的专长,但希望有一种方法可以注入一些自定义代码,这些代码将使用对 db 的调用来构建查询,然后将该查询传递给 SSRS 包的其余部分。但是,您再次超出了我对 SSRS 的专业知识范围。您可以考虑打开一个与 Matrix 组件相关的新案例,以 SSRS 作为标签。
    • OP 已经打开了这样一个问题,在这里:stackoverflow.com/questions/3766227/ssrs-matrix-pivot。从那以后,我提出了一个答案。
    • 我还开了一张新票,马克有答案。我还没有用我可以解决的 sql 验证它,我没有使用 Matrix,而是使用 Table,它似乎非常快。感谢所有人。
    【解决方案2】:

    如果使用 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
    

    【讨论】:

    • 非常好,它有效,我也试图在 SSRS 中实现同样的效果。
    • @user420054:我使用 SSRS,但我总是使用存储过程——不是矩阵/等,抱歉。
    【解决方案3】:

    您可以执行以下操作:

    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
    

    【讨论】:

    • Col3 值不是静态的,可以是任何东西。为了示例,我在这里提到了它。我正在使用 sql 2005。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多