akhter86 Ответов: 1

Сводная таблица со случаем, когда ошибка условия.


Когда я выполняю хранимую процедуру, она генерирует ошибку, о которой говорится ниже..

Msg 207, Level 16, State 1, Line 7
Invalid column name 'CL'.
Msg 207, Level 16, State 1, Line 13
Invalid column name 'H'.
Msg 207, Level 16, State 1, Line 15
Invalid column name 'A'.
Msg 207, Level 16, State 1, Line 15
Invalid column name 'P'.


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

ALTER Procedure [dbo].[Pivot_Attendance2]


As  
Begin 

SELECT DISTINCT ReportingDate INTO #Dates
FROM EmployeesAttendance

ORDER BY ReportingDate

DECLARE @cols NVARCHAR(4000)
SELECT  @cols = COALESCE(@cols + ',[' + CONVERT(varchar, DATEPART(DAY, ReportingDate), 112)
				+ ']','[' + CONVERT(varchar,DATEPART(DAY, ReportingDate), 112) + ']')
FROM    #Dates
ORDER BY ReportingDate


-- Building the query with dynamic dates
--DECLARE @qry NVARCHAR(4000)
--SET @qry =
--'SELECT * FROM
--(SELECT EmpID, Status , ReportingDate
--FROM EmployeesAttendance)emp
--PIVOT (MAX(Status) FOR ReportingDate IN (' + @cols + ')) AS stat'

DECLARE  @qry NVARCHAR(4000) =
N'SELECT * 
FROM (SELECT     EmpID, ReportingDate, CASE WHEN [Days] IS null AND EXISTS
                          (SELECT     1
                            FROM          EmpApplication
                            WHERE      EmployeesAttendance.Empid = EmpApplication.Empid AND 
                            (ReportingDate >= LeavFrom AND ReportingDate <= LeavTo))
                             THEN CL
                             WHEN [Days] IS null AND
                       EXISTS
                          (SELECT     1
                            FROM          Holidays
                            WHERE      ReportingDate = HolidayDate) 
                            THEN H 
                                                        
                            WHEN [Days] IS null THEN A WHEN [Days] = 1 THEN P END AS Status,

DATEPART(DAY, EmployeesAttendance.ReportingDate)as DDate

FROM EmployeesAttendance  )emp
PIVOT (MAX(Status) FOR DDate IN (' + @cols + ')) AS stat 
'
-- Executing the query

EXEC(@qry)
 
END

1 Ответов

Рейтинг:
7

Wendelius

Судя по сообщению об ошибке, у вас нет столбцов CL, A или H в таблице EmployeesAttendance.

Если вы пытаетесь использовать литералы, то окружите значения апострофами. Иначе говоря

... AND ReportingDate <= LeavTo))
THEN ''CL''
WHEN ...

В противном случае повторно проверьте определение схемы таблицы.


akhter86

Дорогой @Wendelius

если я даю апострофы, то при выполнении процедуры хранения он генерирует ошибку (Msg 102, Уровень 15, состояние 1, процедура Pivot_Attendance2, строка 13
Неправильный синтаксис рядом с буквой "CL".
Msg 137, Уровень 15, Состояние 2, Процедура Pivot_Attendance2, Строка 28
Необходимо объявить скалярную переменную "@qry".)

Wendelius

Поскольку апострофы находятся внутри строки, вам нужно использовать двойные апострофы. Прости меня за это!

Смотрите обновленный пример.

akhter86

спасибо, Венделиус....
За Вашу поддержку и еще раз спасибо ...

Wendelius

Пожалуйста :)