首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CASTing在联合过程中导致错误

CASTing在联合过程中导致错误
EN

Stack Overflow用户
提问于 2013-09-18 18:49:56
回答 2查看 62关注 0票数 0

我一直在进行一个查询:

代码语言:javascript
复制
DECLARE @userParam VARCHAR(100)
    ,@startDateParam DATETIME

SET @userParam = ''
SET @startDateParam = '2013-09-02 00:00:00'

SELECT '1' AS RowType
    ,'Person' AS Person
    ,'Project' AS Project
    ,'Sprint' AS Sprint
    ,'Story' AS Story
    ,'Task' AS Task
    ,(
        CASE 
            WHEN DATEPART(dw, @startDateParam) = 2
                THEN 'Monday'
            ELSE ''
            END
        ) AS Monday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 1, @startDateParam)) = 3
                THEN 'Tuesday'
            ELSE ''
            END
        ) AS Tuesday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 2, @startDateParam)) = 4
                THEN 'Wednesday'
            ELSE ''
            END
        ) AS Wednesday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 3, @startDateParam)) = 5
                THEN 'Thursday'
            ELSE ''
            END
        ) AS Thursday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 4, @startDateParam)) = 6
                THEN 'Friday'
            ELSE ''
            END
        ) AS Friday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 5, @startDateParam)) = 7
                THEN 'Saturday'
            ELSE ''
            END
        ) AS Saturday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 6, @startDateParam)) = 1
                THEN 'Sunday'
            ELSE ''
            END
        ) AS Sunday
    ,'Total' AS Total
--

UNION ALL

--
SELECT '2' AS RowType
    ,'' AS Person
    ,'' AS Project
    ,'' AS Sprint
    ,'' AS Story
    ,'' AS Task
    ,(
        CASE 
            WHEN DATEPART(dw, @startDateParam) = 2
                THEN CONVERT(VARCHAR(10), @startDateParam, 111)
            ELSE ''
            END
        ) AS Monday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 1, @startDateParam)) = 3
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 1, @startDateParam), 111)
            ELSE ''
            END
        ) AS Tuesday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 2, @startDateParam)) = 4
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 2, @startDateParam), 111)
            ELSE ''
            END
        ) AS Wednesday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 3, @startDateParam)) = 5
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 3, @startDateParam), 111)
            ELSE ''
            END
        ) AS Thursday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 4, @startDateParam)) = 6
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 4, @startDateParam), 111)
            ELSE ''
            END
        ) AS Friday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 5, @startDateParam)) = 7
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 5, @startDateParam), 111)
            ELSE ''
            END
        ) AS Saturday
    ,(
        CASE 
            WHEN DATEPART(dw, DATEADD(DAY, 6, @startDateParam)) = 1
                THEN CONVERT(VARCHAR(10), DATEADD(DAY, 6, @startDateParam), 111)
            ELSE ''
            END
        ) AS Sunday
    ,'' AS Total
--

UNION ALL

--
SELECT '3' AS RowType
    ,DTH.PointPerson AS Person
    ,PDT.[Name] AS Project
    ,(
        CASE 
            WHEN TSK.NAME IS NULL
                THEN NULL
            WHEN SPT.[Name] + ' - ' + SPT.[Description] IS NULL
                THEN 'KanBan'
            ELSE SPT.[Name] + ' - ' + SPT.[Description]
            END
        ) AS Sprint
    ,COALESCE(STY.[Number], NSS.IncidentNumber) AS Story
    ,TSK.[Name] AS Task
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 2
                THEN DTH.[Hours]
            ELSE 0
            END) AS Monday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 3
                THEN DTH.[Hours]
            ELSE 0
            END) AS Tuesday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 4
                THEN DTH.[Hours]
            ELSE 0
            END) AS Wednesday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 5
                THEN DTH.[Hours]
            ELSE 0
            END) AS Thursday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 6
                THEN DTH.[Hours]
            ELSE 0
            END) AS Friday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 7
                THEN DTH.[Hours]
            ELSE 0
            END) AS Saturday
    ,SUM(CASE 
            WHEN DATEPART(dw, DTH.ActivityDate) = 1
                THEN DTH.[Hours]
            ELSE 0
            END) AS Sunday
    ,SUM(DTH.[Hours]) AS Total
FROM DailyTaskHours DTH
LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task
LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story
LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory
LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint
LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product
GROUP BY DTH.PointPerson
    ,PDT.[Name]
    ,SPT.[Name]
    ,SPT.[Description]
    ,STY.[Number]
    ,NSS.IncidentNumber
    ,TSK.[Name]
HAVING SUM(DTH.[Hours]) > 0

第二和第三街区之间的联合造成了问题。

具体而言:将数据类型varchar转换为数值时出错。

我知道错误在哪里,在前两个块中,周一到周五的列是varchar,而在最后一个块上,它们不是。

我试过铸造它们:

代码语言:javascript
复制
SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 2
            THEN CAST (DTH.[Hours] AS VARCHAR(80))
        ELSE 0
        END) AS Monday

现在正在获取此错误:在将varchar值'0.25‘转换为数据类型int时,转换失败。

我不明白为什么,据我所见,我不是试图将0.25转换为int,而是试图将其转换为varchar()

怎样才能达到预期的效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 18:53:37

在本例中,其他部分返回一个数值,这将导致返回值的数字数据类型。你必须把演员移出总数:

代码语言:javascript
复制
CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 2
            THEN DTH.[Hours]
        ELSE 0
        END) AS VARCHAR(80)) AS Monday
票数 2
EN

Stack Overflow用户

发布于 2013-09-18 19:00:05

试试这个:

代码语言:javascript
复制
    CAST (SUM(CASE 
              WHEN DATEPART(dw, DTH.ActivityDate) = 2
              THEN DTH.[Hours] 
              ELSE 0 END)
    AS VARCHAR(80)) AS Monday
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18880040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档