我有一个看起来像这样的表:
Month Site Val
2009-12 Microsoft 10
2009-11 Microsoft 12
2009-10 Microsoft 13
2009-12 Google 20
2009-11 Google 21
2009-10 Google 22
我希望获得一个二维表格,为每个网站的月份提供“Val”,例如:
Month Microsoft Google
2009-12 10 20
2009-11 12 21
2009-10 13 22
但问题是,我不知道“网站”中可能存在的所有可能值。如果出现新网站,我想在结果表中自动获取新列。
我看到的所有可以执行此操作的代码示例都要求我在查询文本中对“Microsoft和Google”进行硬编码 I saw one that didn't,但它基本上是通过列出网站并在运行中生成查询(连接字符串)来伪造它的。
有没有办法让SQL Server 2008在没有这样的黑客的情况下执行此操作?
注意:我需要能够将此作为我从ASP.Net发送的查询运行,我无法执行存储过程或其他类似的操作。
谢谢!
丹尼尔
答案 0 :(得分:6)
您链接的示例使用动态SQL。不幸的是,当事先不知道输出列时,在SQL Server中没有其他内置的旋转方法。
如果数据不是太大,那么从ASP.NET运行普通行查询并在应用程序代码中执行数据透视可能最简单。如果数据非常大,那么在首次查询可能的列值之后,您必须动态生成SQL。
请注意,您实际上不需要编写生成动态SQL的SQL语句;你可以简单地在ASP.NET中生成SQL,这很可能会更容易。只是不要忘记在生成的查询中放弃它们之前逃避不同的Site
值,并且不要忘记参数化没有数据透视表时通常会出现的SQL语句的任何部分。
答案 1 :(得分:0)
已经十多年了,同样的问题出现在我身上。
有什么方法可以在不知道列名的情况下进行数据透视吗?
然后我进行了搜索,找到了以下解决方案。我们可以通过使用动态查询来实现。我要添加它,这样对某人有帮助。
x,y
如您所见,我将列值放入字符串中,然后动态地使用它来进行旋转。
这是结果:
答案 2 :(得分:-1)
选择月份, min(个案网站'microsoft'then val end)microsoft, min(案例网站'google'then val end)google 从没有透视 按月分组
select main.month,
m.val as microsoft,
g.val as google
from withoutpivot main
inner join withoutpivot m on m.month=main.month
inner join withoutpivot g on g.month=main.month
where m.site='microsoft'
and g.site='google'