Sql server SQL Server-使用新列将一列的值显示到单行中

Sql server SQL Server-使用新列将一列的值显示到单行中,sql-server,Sql Server,我想在单行中为特定列显示6行的值,6列为6个值 实际上,我们有一个列TestValues,其中存储了6个由“@”分割的值。但我们希望它显示在UI上的不同文本框中,但我们只能在SQL Server存储过程中拆分它们 使用此查询的当前输出: SELECT Code,Reason, LTRIM(RTRIM(m.n.value('.[1]','varchar(500)'))) AS TestValues FROM ( SELECT Code,Reason, CAST('<XMLRoot>&

我想在单行中为特定列显示6行的值,6列为6个值

实际上,我们有一个列TestValues,其中存储了6个由“@”分割的值。但我们希望它显示在UI上的不同文本框中,但我们只能在SQL Server存储过程中拆分它们

使用此查询的当前输出:

SELECT Code,Reason, 
LTRIM(RTRIM(m.n.value('.[1]','varchar(500)'))) AS TestValues
FROM
(
SELECT Code,Reason, CAST('<XMLRoot><RowData>' + REPLACE(TestValues,'##@##','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM dbo.Information where Logged_ID = 1001
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
期望输出:

我尝试了下面的查询,但它不工作。。。请让我知道我错在哪里

select * from 
(   
    select *, rank() over (partition by TestValues order by code) rank from
    (
        SELECT Code,Reason, 
        LTRIM(RTRIM(m.n.value('.[1]','varchar(500)'))) AS TestValues
        FROM
        (
        SELECT Code,Reason, CAST('<XMLRoot><RowData>' + REPLACE(TestValues,'##@##','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
        FROM dbo.Information where Logged_ID = 1001
        )t
        CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
    ) r
)tab1
pivot
(
max([TestValues]) for rank in ([1],[2],[3],[4],[5],[6])) pv

你为什么不试着看看这个中间选择

select *, rank() over (partition by TestValues order by code) rank from
    (
        SELECT Code,Reason, 
        LTRIM(RTRIM(m.n.value('.[1]','varchar(500)'))) AS TestValues
        FROM
        (
        SELECT Code,Reason, CAST('<XMLRoot><RowData>' + REPLACE(TestValues,'##@##','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
        FROM dbo.Information where Logged_ID = 1001
        )t
        CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
    ) r
秩值中有一个答案-每行为1。这就是为什么您的数据透视中只有组[1]充满了数据注释,有一个您定义的正确的最大值;注意,最大值来自字符串,而不是数字

分区按TestValues-分区为每个TestValues重新启动排序。分区在这里是指组。每组排名、每组行数等。如果将分区应用于唯一列,则每一行的rank/rk=1,因为ranking/rn将为每一个分区的每一行重新启动

以下是应用于类似您的数据集的不同窗口函数的示例:

其中一个适合你的需要

顺便说一句,秩函数有时应该对分区中的不同行给出相同的结果。查看dup行的rank和rn函数结果之间的差异,请参阅我在SQLFIDLE上的注释


我会从dbo.Information中获取一些其他信息,以保持测试结果的正确顺序。按组中每个测试相同的名称排序,或按与测试顺序无关的测试结果排序,可能会每次为相同的参数提供不同的输出,并且可能由于排序错误而不正确。

正如我在评论中所说,目前,您得到的顺序是完全随机的,由于缺乏标识、订购、标签。因此,您可以使用此选项,但每次运行查询时,结果都会更改:

USE Sandbox;
GO

CREATE TABLE dbo.SampleData(Code varchar(15),
                            Reason varchar(4),
                            testValues varchar(7));
GO
INSERT INTO dbo.SampleData (Code,
                            Reason,
                            testValues)
VALUES ('Phlebotomist','test','12345'),
       ('Phlebotomist','test','23456'),
       ('Phlebotomist','test',''),
       ('Phlebotomist','test','123456'),
       ('Phlebotomist','test','1234567'),
       ('Phlebotomist','test','12345');
GO
WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY Code, Reason ORDER BY NEWID()) AS RN --PARTITION BY is a guess, NEWID as order is random as currently stands 
    FROM dbo.SampleData)
SELECT Code, Reason,
       MAX(CASE RN WHEN 1 THEN RNs.testValues END) AS BusinessUnit,
       MAX(CASE RN WHEN 2 THEN RNs.testValues END) AS MainUnit,
       MAX(CASE RN WHEN 3 THEN RNs.testValues END) AS [Location],
       MAX(CASE RN WHEN 4 THEN RNs.testValues END) AS CustID
FROM RNs
GROUP BY Code, Reason;
GO

GO
DROP TABLE dbo.SampleData;
不过,只要条目的顺序始终相同,就很容易修复。添加一个标识列您可能会使用其他内容,但您需要添加一些内容才能确定顺序:

CREATE TABLE dbo.SampleData(SomeID int IDENTITY(1,1), --Something to ORDER BY!
                            Code varchar(15),
                            Reason varchar(4),
                            testValues varchar(7));
GO
INSERT INTO dbo.SampleData (Code,
                            Reason,
                            testValues)
VALUES ('Phlebotomist','test','12345'),
       ('Phlebotomist','test','23456'),
       ('Phlebotomist','test',''),
       ('Phlebotomist','test','123456'),
       ('Phlebotomist','test','1234567'),
       ('Phlebotomist','test','12345');
GO
WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY Code, Reason ORDER BY SomeID ASC) AS RN --NOw we have an order we can rely on!
    FROM dbo.SampleData)
SELECT Code, Reason,
       MAX(CASE RN WHEN 1 THEN RNs.testValues END) AS BusinessUnit,
       MAX(CASE RN WHEN 2 THEN RNs.testValues END) AS MainUnit,
       MAX(CASE RN WHEN 3 THEN RNs.testValues END) AS [Location],
       MAX(CASE RN WHEN 4 THEN RNs.testValues END) AS CustID
FROM RNs
GROUP BY Code, Reason;

GO
DROP TABLE dbo.SampleData;

不要忘记,表中的数据存储在堆中。它没有固有的顺序。

这些列标题来自哪里,您如何确定结果的顺序?例如,我看不到ID/标签列?具体来说,决定列TestValues顺序的是1234523456、123456123456712345?我想不出有ORDERBY子句能够创建这样的顺序,特别是12345在末尾和开头。另外,请不要以图片形式发布数据,请以文本形式提供。你有足够的声誉知道这一点。如果您询问所需的o/p图像。。标题只是我输入的文本。我需要与当前o/p图像中相同的订单。发布图片更快捷。不过我知道。那么,如何使用ORDERBY子句实现该顺序呢?有了该图像中的数据,这是不可能的,因此将值分配给哪个列将是完全随机的。@IdontKnowEnglish?我编写了与您的查询匹配的查询。谢谢@Larnu,非常感谢。我在存储过程中创建了一个临时表。。工作顺利。