2016-04-12 3 views
0

У меня есть следующий SQL-запрос:SQL-запрос с шарниром дает ошибку

SELECT * 
FROM (
SELECT ClientNumber, ClientName, YearEndDate, schedule, a1, ad1, a2, ad2, a3, ad3, 
cv.[id] as CvId, 
[dataCV] = 
CASE cv.[id] 
WHEN 'DATUM_AVA' THEN CONVERT(DATETIME, cv.[data], 112) 
WHEN 'RECHTSVORM' THEN cv.[data] 
END, 
DATEADD(day, 30, [data]) AS Stat_Filing_Date, 
To_Be_Filed = 
CASE 
WHEN DATEADD(day, 30, [data]) < GETDATE() THEN 'Yes' 
ELSE 'No' 
END 
FROM EngagementFiles ef 
INNER JOIN ac 
ON ef.id = ac.EngagementFile_Id 
INNER JOIN cv 
ON ef.id = cv.EngagementFile_Id 
RIGHT JOIN sh 
ON ac.short_name = sh.a3 OR ac.short_name = sh.a2 OR ac.short_name = sh.a1 
WHERE (schedule = 'G21-9A' OR schedule = 'G21-9B') AND sh.EngagementFile_Id = ef.id AND (ac.act_type = 'C' OR ac.act_type = 'H') 
AND schedule = 
CASE WHEN 
    (
    SELECT cv.[data] 
    FROM cv 
    WHERE [id] = 'REPORT_TYPE' AND cv.EngagementFile_Id = ef.id 
    ) LIKE '%VKT%' THEN 'G21-9B' ELSE 'G21-9A' END 
AND ((cv.[id] = 'DATUM_AVA' AND cv.[form] = '' AND cv.[group] = '')) 
) AS s 
PIVOT (
    MAX(dataCV) 
    FOR [CvId] IN ([DATUM_AVA] 
    ) 
)AS pvt 

Это возвращает следующий результат:

enter image description here

Теперь я хочу добавить еще один столбец в сводной части, также поступает из таблицы cv. Структура этой таблицы выглядит странно. Он имеет следующие столбцы: id, form, group и data.

Идентификаторы, форма и группа столбцов на самом деле являются своего рода уникальным идентификатором, который используется в другом приложении.

Столбец, который я хочу добавить, содержит данные из таблицы cv, где id = RECHTSVORM, а группа и форма пусты.

Запрос, с которым я попытался это следующее:

SELECT * 
FROM (
SELECT ClientNumber, ClientName, YearEndDate, schedule, a1, ad1, a2, ad2, a3, ad3, 
cv.[id] as CvId, 
[dataCV] = 
CASE cv.[id] 
WHEN 'DATUM_AVA' THEN CONVERT(DATETIME, cv.[data], 112) 
WHEN 'RECHTSVORM' THEN cv.[data] 
END, 
DATEADD(day, 30, [data]) AS Stat_Filing_Date, 
To_Be_Filed = 
CASE 
WHEN DATEADD(day, 30, [data]) < GETDATE() THEN 'Yes' 
ELSE 'No' 
END 
FROM EngagementFiles ef 
INNER JOIN ac 
ON ef.id = ac.EngagementFile_Id 
INNER JOIN cv 
ON ef.id = cv.EngagementFile_Id 
RIGHT JOIN sh 
ON ac.short_name = sh.a3 OR ac.short_name = sh.a2 OR ac.short_name = sh.a1 
WHERE (schedule = 'G21-9A' OR schedule = 'G21-9B') AND sh.EngagementFile_Id = ef.id AND (ac.act_type = 'C' OR ac.act_type = 'H') 
AND schedule = 
CASE WHEN 
    (
    SELECT cv.[data] 
    FROM cv 
    WHERE [id] = 'REPORT_TYPE' AND cv.EngagementFile_Id = ef.id 
    ) LIKE '%VKT%' THEN 'G21-9B' ELSE 'G21-9A' END 
AND ((cv.[id] = 'DATUM_AVA' AND cv.[form] = '' AND cv.[group] = '') 
OR (cv.[id] = 'RECHTSVORM' AND cv.[form] = '' AND cv.[group] = '')) 
) AS s 
PIVOT (
    MAX(dataCV) 
    FOR [CvId] IN ([DATUM_AVA], 
        [RECHTSVORM] 
    ) 
)AS pvt 

Но это дает следующее сообщение об ошибке:

Conversion failed when converting date and/or time from character string.

Я предполагаю, что это происходит потому, что для столбца RECHTSVORM также пытаясь преобразовать cv.data в datetime. Что мне нужно изменить, чтобы запрос мог конвертировать cv.data в datetime для столбца DATUM_AVA?

ответ

0

Вполне возможно, что один из Data значений в 'DATUM_AVA' строк не в правильном формате для 112 стиля DATETIME. В этом случае 'yyyymmdd'. См. CAST and CONVERT в MSDN. Вы можете проверить, выбрав из таблицы cv с теми же предикатами и проверив значения.

Независимо от вышеуказанного создаваемого столбца, dataCV, не может быть более одного типа данных. Вы потенциально пытаетесь вставить значение и значения DATETIME с исходным типом данных столбца в созданный столбец dataCV. Если вам нужно знать, что это значение DATETIME, добавьте дополнительный столбец в точку опоры, чтобы помочь вам определить потенциальный тип данных. Затем вы можете преобразовать его.

+0

Что значит добавить дополнительную колонку в ось? Как будет выглядеть этот запрос? – Marijn

Смежные вопросы