标量函数合并行

问题描述

我正在尝试使用将显示值的所有行组合在一起的标量函数

当我运行不同的查询时,我得到的结果是我期望的:

SELECT disTINCT [tblMSC_Notes].[display] 
FROM [tblMSC_Notes]
INNER JOIN [tblUnits_Notes] ON [tblUnits_Notes].[NotesID] = [tblMSC_Notes].[NoteID]
WHERE (([tblMSC_Notes].[display] IS NOT NULL) AND ([tblUnits_Notes].[UnitID] = 15)) 
ORDER BY [tblMSC_Notes].[display]

显示的行:

♦
ML
No Cloak

我现在要执行的操作是将“显示器”输出为单个字段“♦,ML,无遮罩”

看看各种示例,我认为我已经很接近了,但是查询不断出现错误

BEGIN
    -- Declare the return variable here
    DECLARE @Result nvarchar(Max)

    SET @Result = ''

    WITH display_CTE (display)
    AS
    (
        SELECT disTINCT [tblMSC_Notes].[display]
        FROM [tblMSC_Notes]
        INNER JOIN [tblUnits_Notes] ON [tblUnits_Notes].[NotesID] = [tblMSC_Notes].[NoteID]
        WHERE (([tblMSC_Notes].[display] IS NOT NULL) AND ([tblUnits_Notes].[UnitID] = @UnitID)) 
        ORDER BY [tblMSC_Notes].[display]
    )

    SET @Result = (SELECT COALESCE(@Result  + ',','') as displayResult
    FROM (
        SELECT [tblMSC_Notes].[display] 
        FROM [tblMSC_Notes]
        WHERE [display] IN (SELECT display FROM display_CTE) 
        ORDER BY [tblMSC_Notes].[display]
        )
    )

-- Return the result of the function
RETURN @Result

END

我打算在另一个查询中将其设为标量函数

这是tblMSC_Notes表中的一些示例数据:

ID UnitID NotesID
1  1513   154 
2  1513   154
3  5032   152
4  5032   155
5  5033   152 
6  5033   155 
7  5033    43 
8  5034    43 
9  5034   152 
10 5034   155 
11 5035   152 
12 5035   155 
13 5035    43 

这里使用注释ID进行加入

ID UnitID NotesID display 
1  1513       154 LB 
2  1513       154 LB 
3  5032       152 AL 
4  5032       155 PL 
5  5033       152 AL 
6  5033       155 PL 
7  5033        43 N 
8  5034        43 N
9  5034       152 AL
10 5034       155 PL 

Mohd-感谢您的帮助,所以我只需要将create函数更改为:

CREATE FUNCTION [dbo].[fnAnnex03_MasterShipChart_Notes] ( 
-- Add the parameters for the function here 
@UnitID int 
) 
RETURNS nvarchar(Max) 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @Result nvarchar(Max) 
SET @Result = ''

SET @Result = (SELECT string_agg(disTINCT [tblMSC_Notes].[display],') FROM [tblMSC_Notes] INNER JOIN [tblUnits_Notes] ON [tblUnits_Notes].[NotesID] = [tblMSC_Notes].[NoteID] WHERE (([tblMSC_Notes].[display] IS NOT NULL) AND ([tblUnits_Notes].[UnitID] = @UnitID)) ORDER BY [tblMSC_Notes].[display]) 

-- Return the result of the function 
RETURN @Result 
END 
GO 

解决方法

您能否为此示例提供一个包含数据的字段。

您只需要在此查询中使用string_agg,如下所示:

SELECT string_agg(DISTINCT [tblMSC_Notes].[Display],',')
        FROM [tblMSC_Notes]
        INNER JOIN [tblUnits_Notes] ON [tblUnits_Notes].[NotesID] = [tblMSC_Notes].[NoteID]
        WHERE (([tblMSC_Notes].[Display] IS NOT NULL) AND ([tblUnits_Notes].[UnitID] = @UnitID)) 
        ORDER BY [tblMSC_Notes].[Display]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...