【问题标题】:SQL query with pivot gives error带有枢轴的 SQL 查询给出错误
【发布时间】:2016-04-13 00:09:17
【问题描述】:

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

这将返回以下结果:

现在我想在也来自 cv 表的数据透视部分添加另一列。这张表的结构有点奇怪。它有以下列:id、form、group和data。

id、form 和 group 列实际上是在不同的应用程序中使用的某种唯一 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 列的日期时间,我需要进行哪些更改?

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

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

    不管您要创建的列dataCV 的上述数据类型如何,都不能超过一种数据类型。您可能会尝试将 DATETIME 值和原始列数据类型的值插入到创建的 dataCV 列中。如果您需要知道它是一个 DATETIME 值,请在数据透视表中添加一个附加列以帮助您识别潜在的数据类型。之后就可以转换了。

    【讨论】:

    • 向数据透视表添加一个额外的列是什么意思?该查询会是什么样子?
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多