如何在SQL Server中将两表列合并为一列

时间:2018-08-23 19:02:20

标签: sql-server sql-server-2014

我是SQL Server的新手。我有一个剧本。请先检查脚本

SELECT
    WOtask.PK,
    WOPK,
    TaskNo,
    TaskAction = CASE
                    WHEN WOTask.AssetPK IS NOT NULL 
                       THEN '<b>' + Asset.AssetName + ' [' + Asset.AssetID + ']</b> ' + 
                          CASE
                             WHEN Asset.Vicinity IS NOT NULL 
                                  AND Asset.Vicinity <> '''' 
                                THEN RTRIM(Asset.Vicinity) + ': '
                             ELSE ''''
                          END + WOtask.TaskAction + CASE
                    WHEN CONVERT(varchar, ValueLow) IS NOT NULL AND
                      CONVERT(varchar, ValueHi) IS NOT NULL AND
                      Spec = 1 THEN  ' ('+ 'Range:'+ '' + CONVERT(VARCHAR,CONVERT(FLOAT,ISNULL(ValueLow,0))) + ' - ' + CONVERT(VARCHAR,CONVERT(FLOAT,ISNULL(ValueHi,0))) + ')'
                    ELSE ''
                  END
                ELSE WOtask.TaskAction + CASE
                    WHEN CONVERT(varchar, ValueLow) IS NOT NULL AND
                      CONVERT(varchar, ValueHi) IS NOT NULL AND
                      Spec = 1 THEN  ' ('+ 'Range:'+ '' + CONVERT(VARCHAR,CONVERT(FLOAT,ISNULL(ValueLow,0))) + ' - ' + CONVERT(VARCHAR,CONVERT(FLOAT,ISNULL(ValueHi,0))) + ')'
                    ELSE ''
                  END 
              END , 
    Rate,
    Measurement,
    Initials,
    Fail,
    Complete,
    Header,
    LineStyle,
    WOtask.Comments,
    WOtask.NotApplicable,
    WOTask.Photo1,
    WOTask.Photo2
FROM 
    WOtask WITH (NOLOCK)
LEFT OUTER JOIN 
    Asset WITH (NOLOCK) ON Asset.AssetPK = WOTask.AssetPK
LEFT OUTER JOIN 
    AssetSpecification ON AssetSpecification.PK = WOTask.AssetSpecificationPK
WHERE 
    (WOPK IN (SELECT WOPK
              FROM WO WITH (NOLOCK)
              LEFT OUTER JOIN Asset WITH (NOLOCK) ON Asset.AssetPK = WO.AssetPK
              LEFT OUTER JOIN AssetHierarchy WITH (NOLOCK) ON AssetHierarchy.AssetPK = WO.AssetPK
              WHERE WO.WOPK = 10939)
    )
ORDER BY 
    WOPK, TaskNo

这是输出:

enter image description here

现在我的要求是将TaskAction和Comment列合并为一列。我想举一个我的要求的例子:该列必须显示TaskAction值加Comment:hi(comment column value)。我一直在尝试将CONVERT Function用于concat两列,但是由于将convert函数应用于错误的位置,所以我无法获得结果。

请帮助我一些解决方案。预先感谢

1 个答案:

答案 0 :(得分:2)

这是您应该使用的SQL:

SELECT WOtask.PK
     , WOPK
     , TaskNo
     , TaskAction = CASE
                        WHEN WOtask.AssetPK IS NOT NULL THEN
                            '<b>' + Asset.AssetName + ' [' + Asset.AssetID + ']</b> ' + CASE
                                                                                            WHEN Asset.Vicinity IS NOT NULL
                                                                                                 AND Asset.Vicinity <> '''' THEN
                                                                                                RTRIM(Asset.Vicinity) + ': '
                                                                                            ELSE
                                                                                                ''''
                                                                                        END + WOtask.TaskAction
                            + CASE
                                  WHEN CONVERT(VARCHAR, ValueLow) IS NOT NULL
                                       AND CONVERT(VARCHAR, ValueHi) IS NOT NULL
                                       AND Spec = 1 THEN
                                      ' (' + 'Range:' + '' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueLow, 0))) + ' - '
                                      + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueHi, 0))) + ')'
                                  ELSE
                                      ''
                              END
                        ELSE
                            WOtask.TaskAction
                            + CASE
                                  WHEN CONVERT(VARCHAR, ValueLow) IS NOT NULL
                                       AND CONVERT(VARCHAR, ValueHi) IS NOT NULL
                                       AND Spec = 1 THEN
                                      ' (' + 'Range:' + '' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueLow, 0))) + ' - '
                                      + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueHi, 0))) + ')'
                                  ELSE
                                      ''
                              END
                    END
     , Rate
     , Measurement
     , Initials
     , Fail
     , Complete
     , Header
     , LineStyle
     , WOtask.Comments
     , WOtask.NotApplicable
     , WOtask.Photo1
     , WOtask.Photo2
     , ISNULL(
                 CASE
                     WHEN WOtask.AssetPK IS NOT NULL THEN
                         '<b>' + Asset.AssetName + ' [' + Asset.AssetID + ']</b> ' + CASE
                                                                                         WHEN Asset.Vicinity IS NOT NULL
                                                                                              AND Asset.Vicinity <> '''' THEN
                                                                                             RTRIM(Asset.Vicinity) + ': '
                                                                                         ELSE
                                                                                             ''''
                                                                                     END + WOtask.TaskAction
                         + CASE
                               WHEN CONVERT(VARCHAR, ValueLow) IS NOT NULL
                                    AND CONVERT(VARCHAR, ValueHi) IS NOT NULL
                                    AND Spec = 1 THEN
                                   ' (' + 'Range:' + '' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueLow, 0))) + ' - ' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueHi, 0)))
                                   + ')'
                               ELSE
                                   ''
                           END
                     ELSE
                         WOtask.TaskAction
                         + CASE
                               WHEN CONVERT(VARCHAR, ValueLow) IS NOT NULL
                                    AND CONVERT(VARCHAR, ValueHi) IS NOT NULL
                                    AND Spec = 1 THEN
                                   ' (' + 'Range:' + '' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueLow, 0))) + ' - ' + CONVERT(VARCHAR, CONVERT(FLOAT, ISNULL(ValueHi, 0)))
                                   + ')'
                               ELSE
                                   ''
                           END
                 END
               , ''
             ) + ISNULL(WOtask.Comments, '') AS [Single Column]
FROM WOtask WITH (NOLOCK)
    LEFT OUTER JOIN Asset WITH (NOLOCK) ON Asset.AssetPK = WOtask.AssetPK
    LEFT OUTER JOIN AssetSpecification ON AssetSpecification.PK = WOtask.AssetSpecificationPK
WHERE (WOPK IN
       (
           SELECT WOPK
           FROM WO WITH (NOLOCK)
               LEFT OUTER JOIN Asset WITH (NOLOCK) ON Asset.AssetPK = WO.AssetPK
               LEFT OUTER JOIN AssetHierarchy WITH (NOLOCK) ON AssetHierarchy.AssetPK = WO.AssetPK
           WHERE WO.WOPK = 10939
       )
      )
ORDER BY WOPK
       , TaskNo;