Показывать данные строки в столбцах рядом в SQL Server - PullRequest
1 голос
/ 09 июля 2019

У меня есть таблица EmployeeObjective примерно так:

EmployeeID  Objective   Weightage 
----------------------------------
1             A            20
1             B            20
1             C            20
1             D            20
1             E            20

Я хочу показать приведенную выше таблицу, как показано ниже

EmployeeID  Objective1  Objective1Weightage Objective2 Objective2Weightage......to Objective10 Objective10Weightage
 1           A                 20            B              20     .............      Empty     Empty

Можно ли это сделать с помощью Pivot или любым другимДругой способ?

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

Следующий запрос должен делать то, что вы хотите:

CREATE TABLE #emp (EmployeeID  INT, Objective VARCHAR(10), Weightage INT)
INSERT INTO #emp VALUES
(1,'A',20),
(1,'B',20),
(1,'C',20),
(1,'D',20),
(1,'E',20)

;WITH CTE AS (
SELECT EmployeeID,
    CONVERT(VARCHAR(100), Objective) AS Objective,
    CONVERT(VARCHAR(100), Weightage) AS Weightage,
    ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY (SELECT 1)) rno 
FROM #emp )

SELECT * FROM (

SELECT EmployeeID, Val, Col+CAST(rno AS VARCHAR(20)) AS Col
FROM CTE
UNPIVOT(Val FOR Col IN (Objective,Weightage) ) unpiv ) a
PIVOT (
MAX(Val) FOR Col IN ([Objective1],[Weightage1],[Objective2],[Weightage2],[Objective3],[Weightage3],[Objective4],[Weightage4],[Objective5],[Weightage5])) piv
0 голосов
/ 09 июля 2019

Наконец мне удалось получить вывод с помощью запроса ниже.

DECLARE @T TABLE
    (
    EmployeeID INT NOT NULL 
    ,Objective NVARCHAR(250)
    , ObjectiveWeightage DECIMAL(6,4) NOT NULL
    )

INSERT INTO @T
(EmployeeID, Objective, ObjectiveWeightage)
   VALUES (1, 'A', 5 )
        , (1, 'B', 10   )
        , (1, 'C', 15   )
        , (1, 'D', 20   )
        , (1, 'E', 5    )
        , (1, 'F', 51   )
;WITH CTE_Rank AS
    (
    SELECT EmployeeID
        , Objective
        , ObjectiveWeightage 
        , sObjective = 'Objective' + CAST(DENSE_RANK() OVER (PARTITION BY EmployeeID ORDER BY Objective) AS VARCHAR(10))
        , sObjectiveWeightage  = 'ObjectiveWeightage' + CAST(DENSE_RANK() OVER (PARTITION BY EmployeeID ORDER BY Objective) AS VARCHAR(10))
    FROM @T
    )

SELECT EmployeeID 
    ,MAX( Objective1) Objective1 
    ,MAX( ObjectiveWeightage1)ObjectiveWeightage1
    ,MAX( Objective2         )Objective2 
    ,MAX( ObjectiveWeightage2)ObjectiveWeightage2
    ,MAX( Objective3         )Objective3
    ,MAX( ObjectiveWeightage3)ObjectiveWeightage3
    ,MAX( Objective4         )Objective4
    ,MAX( ObjectiveWeightage4)ObjectiveWeightage4
    ,MAX( Objective5         )Objective5
    ,MAX( ObjectiveWeightage5)ObjectiveWeightage5
    ,MAX( Objective6         )Objective6
    ,MAX( ObjectiveWeightage6)ObjectiveWeightage6
    ,MAX( Objective7         )Objective7
    ,MAX( ObjectiveWeightage7)ObjectiveWeightage7
    ,MAX( Objective8         )Objective8
    ,MAX( ObjectiveWeightage8)ObjectiveWeightage8
    ,MAX( Objective9         )Objective9
    ,MAX( ObjectiveWeightage9)ObjectiveWeightage9
    ,MAX( Objective10        )Objective10
    ,MAX( ObjectiveWeightage10)ObjectiveWeightage10
FROM CTE_Rank AS R
    PIVOT(MAX(Objective) FOR sObjective IN ([Objective1], [Objective2], [Objective3], [Objective4],[Objective5],[Objective6],[Objective7],[Objective8],[Objective9],[Objective10])) AS EmployeeObjective
    PIVOT(MAX(ObjectiveWeightage) FOR sObjectiveWeightage IN (ObjectiveWeightage1, ObjectiveWeightage2, ObjectiveWeightage3, ObjectiveWeightage4,ObjectiveWeightage5,ObjectiveWeightage6,ObjectiveWeightage7,ObjectiveWeightage8,ObjectiveWeightage9,ObjectiveWeightage10)) AS EmployeeObjectiveWeightage
GROUP BY EmployeeID
0 голосов
/ 09 июля 2019
select 
        EmployeeID,

        objective1 = max(obj1),
        weightage1 = MAX(weig1),
        objective2 = max(obj2),
        weightage2 = MAX(weig2),
        objective3 = max(obj3),
        weightage3 = MAX(weig3),
        objective4 = max(obj4),
        weightage4 = MAX(weig4),
        objective5 = max(obj5),
        weightage5 = MAX(weig5)
            from
    (
    select
        EmployeeID,
        Objective,
        Weightage,   
        'obj'+cast(row_number() over (partition by EmployeeID order by EmployeeID) as varchar(50)) as O,
        'weig'+cast(row_number() over (partition by EmployeeID order by EmployeeID) as varchar(50)) as W
    FROM table_name)temp
        pivot(max(Objective) for O in (obj1, obj2, obj3, obj4, obj5)) PivO
        pivot(max(Weightage) for W in (weig1, weig2, weig3, weig4, weig5)) PivW

    group by EmployeeID
...