2014-02-16 51 views
-1

我想将多行数据选择到单行中。基于unque值将多行日期选择到一行中

我一起工作的数据有两列:

  • 贷款数字

有不同的行用于连接到贷款数量的每个名称。

实施例:

贷款数1具有3个不同的名称,因此,贷款数有3排,每一个名称。

我想要做的是,采取每个不同的名称,并为其分配一个新的列,所以我有一个独特的行每个贷款号码与每个不同的名称附加到它自己的列中,而不是每行名称。

这是可以在选择状态下使用分区完成的事情吗?

+0

你能表现出一定的样本数据?你想让他们的名字显示在单独的列中还是列中? –

+1

问题的一部分在于,所有的贷款号码都有相同的相关名称数量吗?如果贷款#1有2个名字,但贷款#2有10个名字?你想要8个空列?看看我对这个问题的回答,它会提取2组数据,然后建议如何将它们结合到C#中。这是一个不同的场景,但性质相似。 http://stackoverflow.com/a/21768320/546000 –

+0

@DavidKhaykin是正确的每个贷款的价值数量。但是,如果单列可以为你工作,有一种方法可以在单列中连接字符串 - FOR XML PATH http://stackoverflow.com/questions/6754889/for-xml-path-and-string-concatenation – wruckie

回答

0

我不认为你会用纯SQL做到这一点。我会尝试使用存储过程,像创建临时表。我认为你必须动态建立一个字符串才能执行sqlserver来创建表。然后你可以对它做更新,并最终使用select返回单行。

你打算尝试返回多个贷款,每行一个(尽管每个贷款的贷款名称都在不同的行中)?因为如果贷款一有三个名字,而贷款二有四个名字,那么在同一张表中就不会有效。

如何将所有姓名打包成第二列的管道分隔字符串和第一列的贷款编号?存储过程可能仍然需要,但比创建不同数量的列要容易得多。然后分割数据库客户端的管道以获取名称。

0

虽然你的列名变成用户名,但你可以用动态枢轴来做到这一点,但如果你在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 [email protected]) 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 [email protected]) 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 
+0

谢谢大家,这非常有用。 – nation161r