【问题标题】:Dynamic crosstab in SQL Server 2000SQL Server 2000 中的动态交叉表
【发布时间】:2013-09-17 10:29:42
【问题描述】:

我有一个表格,其中的数据如下所示:

pageno  groupid
100100  mpadilla
100101  Mine
105101  swachman
100100  swachman
105101  Mine
107101  mpadilla

我希望数据在 SQL Server 2000 中看起来像这样(交叉表/数据透视表)(SQL Server 2000 中没有PIVOT):

pageno  Mine    mpadilla        swachman
100100  --          X           X
100101  X           --          --
105101  X           --          X
107101  --          X           --

这是我基于本教程http://msdn.microsoft.com/en-us/library/aa172756.aspx的静态解决方案。:

SELECT pageno, 
    [Mine] = MAX(CASE groupid WHEN 'Mine' THEN 'X' ELSE '--' END),
    [mpadilla] = MAX(CASE groupid WHEN 'mpadilla' THEN 'X' ELSE '--' END),
    [swachman] = MAX(CASE groupid WHEN 'swachman' THEN 'X' ELSE '--' END)
FROM #DistinctPages
GROUP BY pageno
ORDER BY pageno

我需要的是一个用于 SQL Server 2000 的动态交叉表解决方案。我尝试根据我的情况调整它,但我就是不明白:Rows to Columns in SQL Server 2000

任何指导都会有所帮助!

【问题讨论】:

    标签: sql tsql sql-server-2000 dynamic-sql crosstab


    【解决方案1】:
    declare @a varchar(4000)
    set @a = ''
    select @a = @a + x
    from
    (select top 100 percent
    ',[' +groupid + ']=MAX(CASE groupid WHEN ''' +groupid+ '''  THEN ''X'' ELSE ''--'' END)' x
    from #DistinctPages Group by groupid order by groupid) t
    
    exec ('SELECT pageno' + @a + ' FROM #DistinctPages GROUP BY pageno ORDER BY pageno')
    

    【讨论】:

    • @user2766661 做了一个小改动,再试一次
    • ELSE 附近的语法不正确。似乎 3 个单引号将 -- 作为注释而不是语句的一部分。我该如何纠正?当我删除一些匹配的单引号时,我得到了相同的结果。
    • 我又测试了。
    • 好的,现在更进一步了。但它错误:消息 170,级别 15,状态 1,第 1 行第 1 行:'Ilee' 附近的语法不正确。 Ilee 是 groupids 之一。我将尝试修改它,看看我是否可以让它运行。谢谢!如果我被卡住了,我会再问一次。如果您想出错误的答案,请告诉我。
    • @user2766661 他们在不同的范围内运行,不能动态引用临时表。它可以使用永久表完成,但是如果您在查询后刷新表,则当其他用户访问该表时可能会导致一些其他问题。如果您在 groupid 中有引号,它将失败。不过可以换
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 2020-04-10
    • 1970-01-01
    • 2012-09-07
    • 2017-06-15
    • 2016-11-11
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多