带有pivot的SQL查询错误

时间:2016-04-12 14:49:20

标签: sql sql-server pivot

我有以下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。

列id,表单和组实际上是某种在不同应用程序中使用的唯一ID。

我要添加的列包含来自cv表的数据,其中id = RECHTSVORM且group和form为空。

我尝试过的查询如下:

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

但这会产生以下错误:

  

从字符转换日期和/或时间时转换失败   字符串。

我猜这是因为对于RECHTSVORM列,它也试图将cv.data转换为日期时间。 为了使查询只将Cv.data转换为DATUM_AVA列的日期时间,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

Data行中的'DATUM_AVA'值之一可能与112样式DATETIME的格式不正确。在这种情况下'yyyymmdd'。请参阅MSDN中的CAST and CONVERT。您可以通过从cv表中选择具有相同谓词并检查值来进行检查。

无论上述哪个列,您创建的列dataCV都不能超过一种数据类型。您可能尝试将原始列数据类型的DATETIME值和值插入到创建的dataCV列中。如果您需要知道它是DATETIME值,请向数据透视表添加其他列以帮助您识别潜在的数据类型。然后你可以转换。