【问题标题】:SQL Server query focusing on "pivoting" a table containing Non-numeric dataSQL Server 查询侧重于“透视”包含非数字数据的表
【发布时间】:2019-06-18 09:42:59
【问题描述】:

表格名称:职业

**Name  Occupation**  
Samantha    Doctor    
Julia   Actor
Maria   Actor
Meera   Singer
Ashely  Professor
Ketty   Professor
Christeen   Professor
Jane    Actor
Jenny   Doctor
Priya   Singer

我们的目标是编写一个“透视”上述表数据的查询,以便显示以下结果:

Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria

我写了以下查询:

 WITH pivot_data AS
(
SELECT Occupation as Occupation1,  -- Grouping Column
Occupation, -- Spreading Column
Name -- Aggregate Column
FROM Occupations
)
SELECT  [Doctor], [Professor], [Singer], [Actor]
FROM pivot_data 
PIVOT (max(Name) 
       FOR Occupation IN ([Doctor], [Professor], [Singer], [Actor])
                                                            ) AS p;

很遗憾,上述查询给出了以下错误结果:

Doctor  Professor   Singer  Actor    
NULL    NULL    NULL    Maria    
Samantha    NULL    NULL    NULL    
NULL    Ketty   NULL    NULL    
NULL    NULL    Priya   NULL

有人可以发布一个将显示所需结果的 sql 查询吗?(另外,如果您可以使用 sql server“pivot”命令执行一个查询,并使用Out sql server“pivot”命令执行另一个查询,那将非常有帮助)

【问题讨论】:

    标签: sql sql-server pivot aggregate aggregate-functions


    【解决方案1】:

    我不会为此使用枢轴。条件聚合更易于编写和理解。它的性能也几乎总是稍好一些。

    首先,我必须将这些数据转化为可消费的东西。这就是您以后应该发布此类信息的方式。

    declare @Something table
    (
        Name varchar(20)
        , Occupation varchar(20)
    )
    
    insert @Something values
    ('Samantha', 'Doctor')
    , ('Julia', 'Actor')
    , ('Maria', 'Actor')
    , ('Meera', 'Singer')
    , ('Ashely', 'Professor')
    , ('Ketty', 'Professor')
    , ('Christeen', 'Professor')
    , ('Jane', 'Actor')
    , ('Jenny', 'Doctor')
    , ('Priya', 'Singer')
    ;
    

    现在我们可以很容易地使用这些数据生成您的输出。

    with NumberedRows as
    (
        select * 
            , RowNum = ROW_NUMBER() over(partition by Occupation order by name)
        from @Something
    )
    
    select Doctor = max(case when nr.Occupation = 'Doctor' then nr.Name end)
        , Professor = max(case when nr.Occupation = 'Professor' then nr.Name end)
        , Singer = max(case when nr.Occupation = 'Singer' then nr.Name end)
        , Actor = max(case when nr.Occupation = 'Actor' then nr.Name end)
    from NumberedRows nr
    group by nr.RowNum
    

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多