SQL Server 2005 - 在没有总和/计数和动态值列表的情况下透视数据

Posted

技术标签:

【中文标题】SQL Server 2005 - 在没有总和/计数和动态值列表的情况下透视数据【英文标题】:SQL Server 2005 - Pivoting Data without a sum / count and dynamic list of values 【发布时间】:2009-10-08 00:18:05 【问题描述】:

很抱歉,如果另一个问题的其他地方对此进行了介绍,但我找不到任何与我需要的完全匹配的示例,我感到很困惑。

我在表格中有这样的数据:-

Name   |   Value
---------------
John   |   Dog
John   |   Cat
John   |   Fish
Bob    |   Python
Bob    |   Camel

我想要这样的数据....

Name   |  Value_1 | Value_2 | Value_3
-------------------------------------
John   |  Dog     |  Cat    | Fish
Bob    |  Python  |  Camel  | NULL

我不想使用 case 语句,因为狗、猫、鱼等有 20 多个可能的值,而且它们可能会随着时间而改变。

有人指点吗?

【问题讨论】:

【参考方案1】:

这接近于您所追求的。我还包括一个表格创建脚本和示例数据供其他人使用。这个解决方案的灵感来自here

-- Dynamic PIVOT
DECLARE @T AS TABLE(y INT NOT NULL PRIMARY KEY);

DECLARE
@cols AS NVARCHAR(MAX),
@y    AS INT,
@sql  AS NVARCHAR(MAX);

-- Construct the column list for the IN clause
-- e.g., [Dog],[Python]
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()]
FROM (SELECT DISTINCT [Value] AS y FROM dbo.table_1) AS Y
ORDER BY y
FOR XML PATH('')),
1, 1, N'');

-- Construct the full T-SQL statement
-- and execute dynamically
SET @sql = N'SELECT *
FROM (SELECT *
FROM dbo.table_1) AS D
PIVOT(MIN(value) FOR value IN(' + @cols + N')) AS P;';

PRINT @sql
EXEC sp_executesql @sql;
GO

表创建:

CREATE TABLE [dbo].[Table_1](
    [Name] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
    [Value] [varchar](50) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

GO

样本数据:

insert into dbo.table_1 values ('John','Dog')
insert into dbo.table_1 values ('John','Cat')
insert into dbo.table_1 values ('John','Fish')
insert into dbo.table_1 values ('Bob ','Python')
insert into dbo.table_1 values ('Bob ','Camel')

【讨论】:

谢谢,我想这可能暂时可以完成这项工作:)【参考方案2】:

这个问题有点类似:

Cross Tab - Storing different dates (Meeting1, Meeting2, Meeting 3 etc) in the same column

【讨论】:

【参考方案3】:

看看这个:

http://dotnetgalactics.wordpress.com/2009/10/23/using-sql-server-20052008-pivot-on-unknown-number-of-columns-dynamic-pivot/

可能会有所帮助..

【讨论】:

以上是关于SQL Server 2005 - 在没有总和/计数和动态值列表的情况下透视数据的主要内容,如果未能解决你的问题,请参考以下文章

备份没有数据的 SQL Server 2005 数据库

SQL SERVER 2005连接问题

SQL Server 2005 中没有过程的查询计划

我可以在没有 [dbo] 的情况下调用 SQL Server 2005 中的函数吗?

如果存储过程在 SQL Server 2005 上的选择之前进行更新,则没有结果集

如何安装sql server 2005