您可以使用动态枢轴执行此操作,尽管您的列名成为用户名,但如果您在 c# 中处理输出,这没什么大不了的;你可以迭代一个字段计数。一个问题是,如果您有两个同名的用户,他们只会显示一次。
Here's a great SO post on dynamic pivots.
使用这种方法,我想出了下面的示例代码。 (注意 SET @loanID = 1 行 - 在 1 和 2 之间更改以测试输出)
IF OBJECT_ID('TEMPDB..#LOANS') IS NOT NULL
DROP TABLE #LOANS
CREATE TABLE #LOANS (LOANID INT, USERNAME NVARCHAR(100))
INSERT INTO #LOANS
SELECT 1, 'Neal' UNION ALL
SELECT 1, 'Bob' UNION ALL
SELECT 2, 'Sarah' UNION ALL
SELECT 2, 'John' UNION ALL
SELECT 2, 'Elsa' UNION ALL
SELECT 2, 'Jennifer' UNION ALL
SELECT 2, 'Dave'
DECLARE @cols AS NVARCHAR(MAX), @y AS INT, @sql AS NVARCHAR(MAX), @loanID INT
-- set an id here...
SET @loanID = 1
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()]
FROM (SELECT DISTINCT USERNAME AS y
FROM #LOANS
WHERE LOANID=@loanID) AS Y
ORDER BY y
FOR XML PATH('')),
1, 1, N'');
SET @sql = N'SELECT *
FROM (SELECT LOANID, USERNAME
FROM #LOANS
WHERE LOANID='+CAST(@loanID AS NVARCHAR)+') AS D
PIVOT(MIN(USERNAME) FOR USERNAME IN(' + @cols + N')) AS P;';
EXEC sp_executesql @sql;
GO
如果您有用户 ID,则结果可能如下所示:
IF OBJECT_ID('TEMPDB..#LOANS') IS NOT NULL
DROP TABLE #LOANS
CREATE TABLE #LOANS (LOANID INT, USERNAME NVARCHAR(100), USERID INT)
INSERT INTO #LOANS
SELECT 1, 'Neal', 1 UNION ALL
SELECT 1, 'Bob', 2 UNION ALL
SELECT 2, 'Sarah', 3 UNION ALL
SELECT 2, 'John', 4 UNION ALL
SELECT 2, 'Elsa', 5 UNION ALL
SELECT 2, 'Jennifer', 6 UNION ALL
SELECT 2, 'Dave', 7
DECLARE @cols AS NVARCHAR(MAX), @y AS INT, @sql AS NVARCHAR(MAX), @loanID INT
-- set an id here...
SET @loanID = 1
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()]
FROM (SELECT DISTINCT USERID AS y
FROM #LOANS
WHERE LOANID=@loanID) AS Y
ORDER BY y
FOR XML PATH('')),
1, 1, N'');
SET @sql = N'SELECT *
FROM (SELECT LOANID, USERNAME, USERID
FROM #LOANS
WHERE LOANID='+CAST(@loanID AS NVARCHAR)+') AS D
PIVOT(MIN(USERNAME) FOR USERID IN(' + @cols + N')) AS P;';
EXEC sp_executesql @sql;
GO