$ultaNn Ответов: 1

Неверный столбец для сводной таблицы


I was trying to create pivot table from my query when i choose select * from it works fine but when i tries to select columns as shown in below code it gives me error Incorrect column name


select sr,PayDescr,PayMonAmt from (select sr= case when rtrim(Ctname.PayCat)='GS' then  1
                when rtrim(Ctname.PayCat)='BS' then  2
                when rtrim(Ctname.PayCat)='HA' then  3
                when rtrim(Ctname.PayCat)='TA' then  4
                when rtrim(Ctname.PayCat)='FA' then  5
                else 6 end
, PayDescr = rtrim(Ctname.Descr),SUM(PayMonAmt) as PayMonAmt  from 
maEmpPay mn
outer apply(
        select Descr,PayCat from maPayCat pc
        where mn.PayCat = pc.PayCat
        )Ctname
where  EmpID = mn.EmpID group by Ctname.Descr, Ctname.PayCat)   pv 
 pivot
 (
 sum (PayMonAmt) for PayDescr IN ([Basic Salary],[Food Allowance],[Tuition 
 Allowance],[Transportation Allowance])
 ) AS e 

На самом деле я пытаюсь создать pivot для приведенного ниже кода
 select sr= case when rtrim(Ctname.PayCat)='GS' then 1 when
 rtrim(Ctname.PayCat)='BS' then 2
 when rtrim(Ctname.PayCat)='HA' then 3
 when rtrim(Ctname.PayCat)='TA' then 4 
when rtrim(Ctname.PayCat)='FA' then 5
 else 6 end 
, PayDescr = rtrim(Ctname.Descr),SUM(PayMonAmt) as PayMonAmt
 from maEmpPay mn 
outer apply( select Descr,PayCat 
from maPayCat pc where mn.PayCat = pc.PayCat )Ctname
 where EmpID = mn.EmpID
 group by Ctname.Descr, Ctname.PayCat


Что я уже пробовал:

I worsk отлично подходит для оператора Select*, но не при указании имен столбцов

ZurdoDev

В чем именно заключается ошибка?

$ultaNn

PayDescr недопустимое имя столбца''.
PayMonAmt недопустимое имя столбца''.

1 Ответов

Рейтинг:
7

Richard Deeming

Как говорится в ошибке, имена столбцов в вашем внешнем SELECT неверны.

Попробуй:

SELECT
    sr,
    [Basic Salary],
    [Food Allowance],
    [Tuition Allowance],
    [Transportation Allowance]
FROM
(
    SELECT
        sr = CASE
            when rtrim(Ctname.PayCat)='GS' then  1
            when rtrim(Ctname.PayCat)='BS' then  2
            when rtrim(Ctname.PayCat)='HA' then  3
            when rtrim(Ctname.PayCat)='TA' then  4
            when rtrim(Ctname.PayCat)='FA' then  5
            else 6
        END,
        PayDescr = rtrim(Ctname.Descr),
        SUM(PayMonAmt) as PayMonAmt
    FROM
        maEmpPay As mn
        OUTER APPLY
        (
            SELECT Descr, PayCat 
            FROM maPayCat pc
            WHERE mn.PayCat = pc.PayCat
        ) As Ctname
    
    -- TODO: This filter seems to be redundant?
    WHERE
        EmpID = mn.EmpID 
    
    GROUP BY
        Ctname.Descr, 
        Ctname.PayCat
)
PIVOT
(
    SUM(PayMonAmt) FOR PayDescr IN 
    (
        [Basic Salary],
        [Food Allowance],
        [Tuition Allowance],
        [Transportation Allowance]
    )
) As e 
Использование PIVOT и UNPIVOT - SQL Server | Microsoft Docs[^]

NB: То WHERE пункт в вашем внутреннем SELECT похоже, это не имеет никакого смысла. Единственный возможный источник EmpID колонка-это maEmpPay таблица, поэтому ваш фильтр ищет записи, где maEmpPay.EmpID равен самому себе. Это будет справедливо для всех записей, если только у вас нет Null значения в этом столбце.


Maciej Los

5ed!