Sql X基于一列将行数转换为一行
我被要求显示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
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;