Sql server 2005 编写查询的非透视版本

Sql server 2005 编写查询的非透视版本,sql-server-2005,pivot,pivot-table,Sql Server 2005,Pivot,Pivot Table,以下是我的表格结构和一些数据: CREATE TABLE Travel ( ID int primary key, Name nvarchar(25), City nvarchar(25), Month varchar(3) ) INSERT INTO Travel (ID, Name, City, Month) VALUES (1, 'Name1', 'Paris','Jan'), (2, 'Name1', 'Rome','Feb'), (3, 'Name2', 'Ita

以下是我的表格结构和一些数据:

CREATE TABLE Travel 
(
  ID int primary key, 
  Name nvarchar(25),
  City nvarchar(25),
  Month varchar(3)
)

INSERT INTO Travel
(ID, Name, City, Month)
VALUES
(1, 'Name1', 'Paris','Jan'),
(2, 'Name1', 'Rome','Feb'),
(3, 'Name2', 'Italy','Jan'),
(4, 'Name2', 'Rome','Feb'), 
(5, 'Name3', 'Los Angeles','Jan'),
(6, 'Name3', 'New York','Feb');
请有人帮我写出非透视版本,以便仅在有数据时返回“月”列(假设数据库在SQL Server 2005之前)

下面是一个示例查询,但它返回空数据列(Apr、May)


此外,查询的透视版本是什么,因为没有函数来聚合列?

您可以轻松地执行以下操作:

DECLARE
    @v_sql varchar(8000)
BEGIN
Set @v_sql = 'SELECT name '
If exists (select month FROM travel WHERE month='Jan')
BEGIN
  Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Jan'' THEN City END) Jan'
End

If exists (select month FROM travel WHERE month='Feb')
BEGIN
  Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Feb'' THEN City END) Feb'
End

If exists (select month FROM travel WHERE month='Mar')
BEGIN
  Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Mar'' THEN City END) Mar'
End

If exists (select month FROM travel WHERE month='Apr')
BEGIN
  Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Apr'' THEN City END) Apr'
End

If exists (select month FROM travel WHERE month='May')
BEGIN
  Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''May'' THEN City END) May'
End

Set @v_sql = @v_sql + ' FROM Travel GROUP BY name'

EXECUTE(@v_sql)

END
输出:

NAME     JAN           FEB
-------- ------------- -----------
Name1    Paris         Rome
Name2    Italy         Rome
Name3    Los Angeles   New York
别忘了检查

NAME     JAN           FEB
-------- ------------- -----------
Name1    Paris         Rome
Name2    Italy         Rome
Name3    Los Angeles   New York