Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql X基于一列将行数转换为一行_Sql_Sql Server - Fatal编程技术网

Sql X基于一列将行数转换为一行

Sql X基于一列将行数转换为一行,sql,sql-server,Sql,Sql Server,我被要求显示X行数,并将其显示到一行中,该行将显示结果。例如: 数据 Tency Number| ClientNo | Name | DOB | Prim Client | Rent 10001 20 Joe 01/10/1900 Y 100 10001 21 bob 01/10/1901 N 100 10001

我被要求显示X行数,并将其显示到一行中,该行将显示结果。例如:

数据

 Tency Number| ClientNo  |  Name |  DOB       | Prim Client |  Rent
 10001          20          Joe    01/10/1900    Y            100 
 10001          21          bob    01/10/1901    N            100 
 10001          26          jim    01/10/1902    n            100 
用户想要的格式是

Tency Number | ClientNo | Name | DOB        | Prim Client | Rent | Client2 | DOB 2|
10001          20          Joe   01/10/1900      Y           100 |   Bob   01/10/1901 | Jim | 01/10/1902
我们没有一个预定义的客户号链接到Tenacy number。我不知道该用什么来实现这一点。没有任何东西可以透视表,我使用STUFF将所有客户机链接到行上的一列中(但他们不希望这样)

这可能吗?如果是这样,我将如何实现它


谢谢大家!

您需要的SQL类似于:

SELECT  TencyNumber, 
        ClientNo = MIN(CASE WHEN RowNum = 1 THEN ClientNo END),
        Client1 = MAX(CASE WHEN RowNum = 1 THEN Name END),
        DOB1 = MAX(CASE WHEN RowNum = 1 THEN DOB END),
        Client2 = MAX(CASE WHEN RowNum = 2 THEN Name END),
        DOB2 = MAX(CASE WHEN RowNum = 2 THEN DOB END),
        Client3 = MAX(CASE WHEN RowNum = 3 THEN Name END),
        DOB3 = MAX(CASE WHEN RowNum = 3 THEN DOB END)
FROM (  SELECT  TencyNumber, 
                ClientNo,
                Name,
                DOB, 
                PrimClient,
                Rent,
                RowNum = ROW_NUMBER() OVER(PARTITION BY TencyNumber ORDER BY Name)
        FROM    T
    ) c
GROUP BY TencyNumber;
但是,由于客户端数量未知,因此需要动态构建SQL:

DECLARE @SQL NVARCHAR(MAX) = '';
SELECT   @SQL = @SQL + 
                    ',Client' + RowNum + ' = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN Name END)
                    ,DOB' + RowNum + ' = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN DOB END)'
FROM    (   SELECT  RowNum = CAST(ROW_NUMBER() OVER(PARTITION BY TencyNumber ORDER BY Name) AS VARCHAR(10))
            FROM    T
        ) c;

SET @SQL = 'SELECT TencyNumber, ClientNo = MIN(CASE WHEN RowNum = 1 THEN ClientNo END) ' + @SQL + '
            FROM (  SELECT  TencyNumber, 
                            ClientNo,
                            Name,
                            DOB, 
                            PrimClient,
                            Rent,
                            RowNum = ROW_NUMBER() OVER(PARTITION BY TencyNumber ORDER BY Name)
                    FROM    T
                ) c
            GROUP BY TencyNumber;';
EXECUTE SP_EXECUTESQL @SQL;