【问题标题】:How to make Column to Row without an aggregate function in sql server 2005/8?如何在 sql server 2005/8 中使列到行没有聚合函数?
【发布时间】:2010-10-26 04:25:43
【问题描述】:

比如我需要从

我知道 PIVOT 就是为了这个,但它需要一个聚合函数;就我而言,我不需要聚合只需要列到行。

您可以使用以下示例数据:

    CREATE TABLE[StudentScores] 
( 
[UserName] NVARCHAR(20),
[Subject] NVARCHAR(30),
[Score]FLOAT,
) 
GO

INSERT INTO[StudentScores]SELECT'Nick','Chinese',80 

INSERT INTO[StudentScores]SELECT'Nick','Maths',90 

INSERT INTO[StudentScores]SELECT'Nick','English',70 

INSERT INTO[StudentScores]SELECT'Nick','Biology',85 

INSERT INTO[StudentScores]SELECT'Kent','Chinese',80 

INSERT INTO[StudentScores]SELECT'Kent','Maths',90 

INSERT INTO[StudentScores]SELECT'Kent','English',70 

INSERT INTO[StudentScores]SELECT'Kent','Biology',85 

【问题讨论】:

  • 所以您实际上想要多个名为“80”、“90”、“70”、“85”的列?或者您是否在为每个用户名寻找一行并且每列都是主题?在这种情况下,@OMG Ponies 的回答符合您的需求,正如您所见,您确实需要一个聚合。

标签: sql sql-server tsql pivot


【解决方案1】:

如果每个主题有一条记录,您可以使用 MIN 或 MAX。

SELECT *
FROM [StudentScores]
PIVOT
(
  MIN(Score)
  FOR [Subject] IN ([Chinese],[Maths],[English],[Biology])
)
AS p

【讨论】:

    【解决方案2】:

    我无法从您最初的问题中完全看出您要转换哪个领域 - 主题或分数。但是,您可以使用PIVOT 来执行此操作。如果您知道要从行更改为列的列数,则可以使用静态数据透视(类似于其他答案)。如果您不知道要转换的列数,则可以使用动态枢轴:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(subject) 
                        from test
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query 
          = 'SELECT username,' + @cols + ' from 
             (
                select username, subject, score
                from test
             ) x
             pivot 
             (
                avg(score)
                for subject in(' + @cols + ')
             ) p '
    
    execute(@query)
    

    SQL Fiddle with Demo

    我使用AVG() 聚合,以防用户每个主题的得分超过一个。

    【讨论】:

      【解决方案3】:

      11g 中新的 PIVOT 运算符可以帮助您实现所需的输出。例如检查这个 http://querydb.blogspot.in/2014/05/get-data-in-rows-and-aggregates-into.html

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 2020-06-08
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多