Sql 行到单个单元格

Sql 行到单个单元格,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我想得到用绿色标记的期望输出 每个id的数据点被放入一个单元格中 基本上,获取与发生在一起的所有事件,并按可用于XML的相同顺序附加它: SELECT DISTINCT ID, (SELECT [EVENT] +'' FROM YourTable WHERE ID = y.ID FOR XML PATH('') ) as [EVENT] FROM Y

我想得到用绿色标记的期望输出

每个id的数据点被放入一个单元格中

基本上,获取与发生在一起的所有事件,并按可用于XML的相同顺序附加它:

SELECT DISTINCT 
            ID,
            (SELECT [EVENT] +''
            FROM YourTable
            WHERE ID = y.ID
            FOR XML PATH('')
            ) as [EVENT]
FROM YourTable y
输出:

ID  EVENT
1   AABCD
2   AABBCC

使用填充函数:

DECLARE @tblTest AS Table(
    ID INT,
    EVENT VARCHAR(5)
)

INSERT INTO @tblTest VALUES
(1,'A'),
(1,'A'),
(1,'C'),
(2,'A'),
(2,'B'),
(2,'C')

SELECT DISTINCT
    T1.ID,
    STUFF
    (
         (SELECT '' + convert(varchar(10), T2.EVENT, 120)
          FROM @tblTest T2
          where T1.ID = T2.ID
          FOR XML PATH (''))
    , 1, 0, '')  AS EVENT
FROM @tblTest T1

您可以按如下方式使用UDF:

CREATE TABLE t(
id INT,
col CHAR(1)
);

INSERT INTO t VALUES (1,'a');
INSERT INTO t VALUES (1,'b');
INSERT INTO t VALUES (1,'c');
INSERT INTO t VALUES (1,'d');
INSERT INTO t VALUES (2,'e');
INSERT INTO t VALUES (2,'f');
INSERT INTO t VALUES (3,'g');
INSERT INTO t VALUES (4,'h');
UDF(用户定义函数)——

最后,查询和结果:

SELECT id, dbo.ConcatenateCols(id) AS Cols -- UDF - ConcatenateCols(id)
FROM t GROUP BY Id

还可以添加更多信息,如表名,以及您尝试了什么?我们如何知道事件列中的项目应按什么顺序显示?它看起来是按字母顺序排列的,是吗?但你为什么要这么做?!?对我来说,这似乎是一个非常糟糕的主意。我正在做的可能是重复的,以查看哪个id有一个共同的序列来证明事件流是随机的,1,0,”)括号丢失我在我的系统中测试后有答案,没有任何这样的错误我知道它是什么:)这里没有必要使用它。当您需要为XML路径(“”)分隔来自
的值时,通常会使用它,但在这里它没有用-没有分隔符。请复制我的答案。我不明白您为什么没有尝试我的解决方案?简单明了,你选择的答案是我答案的副本,里面有东西(在这里没有用)。另一个使用临时表的,是我答案的副本,是上档的。。。
USE [t]
GO
CREATE FUNCTION dbo.ConcatenateCols(@Id INT)

RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @RtnStr VARCHAR(MAX)

SELECT @RtnStr = COALESCE(@RtnStr + '','') + col
FROM dbo.t
WHERE id = @Id AND col > ''
RETURN @RtnStr

END
GO
SELECT id, dbo.ConcatenateCols(id) AS Cols -- UDF - ConcatenateCols(id)
FROM t GROUP BY Id