微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 STUFF

如何解决使用 STUFF

我想连接逗号分隔的字符串。我有一个查询,我在哪里使用该函数获取员工。

目前,我使用 [dbo].fn_fullname(A.REFNO) 作为 Staff 来获取员工,但如果 cast(S.SCH_NO as varchar) as ReferenceIdentifier 的计数大于 1,我想包含一些条件,然后连接该值。但不确定如何在视图本身内部实现。

这里我尝试使用 STUFF 进行连接。

这是查询

    Alter View vw_TestDB
    AS
       select 
           NEWID() as UniqueKey,P.ID as Number,cast(S.SCH_NO as varchar) as ReferenceIdentifier,cast(S.START_D as datetime2) as StartDateTime,staff = STUFF((
            SELECT ',' + [dbo].fn_fullname(A.REFNO)
            FROM [dbo].[vw_TESTDB]
            FOR XML PATH('')
            ),1,'')
        FROM [dbo].[vw_TestDB]
        group by ReferenceIdentifier
        having count(ReferenceIdentifier)>1,[dbo].fn_fullname(A.REFNO) as Staff,from [dbo].V_SCHEDULES S WITH (NOLOCK)
    inner join [dbo].V_PAT P WITH (NOLOCK) on P.PAT_REFNO = S.PAT_REFNO

这里的功能

    ALTER FUNCTION [dbo].[fn_fullname]
    (
        @refno as numeric(10,0)
    )
    RETURNS varchar(100)
    AS
    BEGIN
        DECLARE @name     as varchar(100)

        SELECT  @name = Stuff(Coalesce(' ' + 
                CASE 
                    WHEN proca.TITLE_REFNO = 3104 
                        THEN NULL
                    ELSE
                        NullIf(dbo.fn_rfval(proca.TITLE_REFNO),'')
                END,'') +
                Coalesce(' ' + proca.forename,'') +
                Coalesce(' ' + proca.surname,''),'') 
        FROM    dbo.v_carers_active proca (nolock)
        WHERE   refno = @refno

        return @name
    END

    GO

这里是示例数据

唯一键 数量 参考标识符 开始日期时间 员工
70DB83D1-2900-4CF1-9CC4-CA6948AC0E91 A4286 2182823 2015-03-26 08:00:00.0000000 S 泰勒女士
310745CB-4724-4724-A5F0-7D9088317E58 A4286 2182823 2015-03-26 08:00:00.0000000 D 柯克帕特里克女士
CA6DDB25-AADD-4FC1-ABAA-2AF84016E6E5 A4286 2182834 2015-03-19 08:00:00.0000000 D 柯克帕特里克女士
6A3C0A3B-EAA3-4523-B4FD-2882E2C02B4A A4286 2182844 2015-03-30 08:00:00.0000000 内尔·麦金农夫人
6399662A-EC4D-4993-8D4F-0BC396D12C2C A4286 2182844 2015-03-30 08:00:00.0000000 Deb Kirkpatrick 女士

预期输出

唯一键 数量 参考标识符 开始日期时间 员工
70DB83D1-2900-4CF1-9CC4-CA6948AC0E91 A4286 2182823 2015-03-26 08:00:00.0000000 S 泰勒女士、D 柯克帕特里克女士
CA6DDB25-AADD-4FC1-ABAA-2AF84016E6E5 A4286 2182834 2015-03-19 08:00:00.0000000 D 柯克帕特里克女士
6A3C0A3B-EAA3-4523-B4FD-2882E2C02B4A A4286 2182844 2015-03-30 08:00:00.0000000 Nel McKinnon 女士、Deb Kirkpatrick 女士

解决方法

不太明白你想要什么。根据示例数据和预期输出,您似乎想要

SELECT  t.[Number],t.[ReferenceIdentifier],t.[StartDatetime],STUFF (
                 (SELECT ',' + [dbo].fn_fullname(x.REFNO)
                  FROM   yourtable AS x
                  WHERE  x.[Number] = t.[Number]
                  AND    x.[ReferenceIdentifier] = t.[ReferenceIdentifier]
                  AND    x.[StartDatetime] = t.[StartDatetime]
                  FOR XML PATH('')),1,'') AS Staff
FROM    yourtable t
GROUP BY t.[Number],t.[StartDatetime]
HAVING COUNT(*) > 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。