如何在MS SQL Server上创建查询或存储过程以从行扩展列

Siw*_*hit 1 sql-server stored-procedures sql-server-2008

在编写此查询时需要您的帮助.

Field 1  
========
Hello
Man
Lady
Run Code Online (Sandbox Code Playgroud)

我需要结果:

F1             F2             F3
=================================
Hello          Null           Null
Man            Null           Null
Lady           Null           Null
Hello          Man            Null
Hello          Lady           Null
Man            Lady           Null
Hello          Man            Lady
==================================  
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 6

没有其他专栏可以确保Man在Lady之前出现,这是有效的.所以这里的一些排列与你的输出相反

添加另一个值,但它变得复杂

DECLARE @t TABLE (SomeCol varchar(30));

INSERT @t VALUES ('Hello'), ('Man'), ('Lady');

SELECT *
FROM
    (
    SELECT DISTINCT
        t1.SomeCol AS F1,
        CASE WHEN t2.SomeCol = t1.SomeCol THEN NULL ELSE t2.SomeCol END AS F2,
        CASE WHEN t2.SomeCol = t1.SomeCol OR t3.SomeCol = t1.SomeCol OR t3.SomeCol = t2.SomeCol THEN NULL ELSE t3.SomeCol END AS F3
        --,
        --CASE WHEN NULLIF(t2.SomeCol, t1.SomeCol) IS NULL THEN NULL ELSE NULLIF(NULLIF(t3.SomeCol, t2.SomeCol), NULLIF(t3.SomeCol, t1.SomeCol)) END AS F3
    FROM
        @t t1
        JOIN
        @t t2 ON t1.SomeCol <= t2.SomeCol
        JOIN
        @t t3 ON t2.SomeCol <= t3.SomeCol
    ) X
ORDER BY
    F3, F2, F1;
Run Code Online (Sandbox Code Playgroud)

与其他一些订购专栏

DECLARE @t TABLE (ID int IDENTITY(1,1), SomeCol varchar(30));

INSERT @t VALUES ('Hello'), ('Man'), ('Lady');

SELECT *
FROM 
    (
    SELECT DISTINCT
        t1.SomeCol AS F1,
        CASE WHEN t2.SomeCol = t1.SomeCol THEN NULL ELSE t2.SomeCol END AS F2,
        CASE WHEN t2.SomeCol = t1.SomeCol OR t3.SomeCol = t1.SomeCol OR t3.SomeCol = t2.SomeCol THEN NULL ELSE t3.SomeCol END AS F3
    FROM
        @t t1
        JOIN
        @t t2 ON t1.ID <= t2.ID
        JOIN
        @t t3 ON t2.ID <= t3.ID
    ) X
ORDER BY
    F3, F2, F1;
Run Code Online (Sandbox Code Playgroud)