将多个SQL字段合并为1个输出行

时间:2010-08-16 14:48:16

标签: sql mysql

拥有类似

的SQL表

UserID |属性|值
1 |用户名|马吕斯
1 |密码| FUBAR

我想创建一个输出:

1 |马吕斯| FUBAR

也许我太累了,看不出来,听起来不太复杂,但我似乎无法弄明白。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

为什么不使用自联接,即。 :

select u1.userid, u1.value, u2.value 
from yourtable u1
inner join yourtable u2 on u2.userid=u1.userid
where u1.attribute='Username' and u2.attribute='Password';

答案 1 :(得分:1)

会是什么......

SELECT userID,
       GROUP_CONCAT (Value SEPARATOR '|')
    FROM my_table
    GROUP BY UserID;

是你在寻找什么?

答案 2 :(得分:0)

编辑:

每个结果一列:

如果您尝试将多个属性与相同的UserID组合,则可能是这样的:

简短查询(一个UserID):

declare @concattedtext varchar(1000)

SELECT @concattedtext=coalesce(@concattedtext + '|', '') + Value
FROM #users WHERE UserID=1

SELECT @concattedtext

使用您的示例数据:

1 | Marius | Fubar

完整查询(所有UserID)

-- Your source table
CREATE Table #users (UserID int, Attribute varchar(50), Value varchar(50))
-- some entries
INSERT into #users (UserID, Attribute, Value)
VALUES (1, 'Test1', 'attr1')
INSERT into #users (UserID, Attribute, Value)
VALUES (1, 'Test2', 'attr2')
INSERT into #users (UserID, Attribute, Value)
VALUES (1, 'Test3', 'attr3')
INSERT into #users (UserID, Attribute, Value)
VALUES (2, 'Test4', 'attr4')

-- ids table variable (for distinct UserID's)
DECLARE @ids TABLE
(
 rownum int IDENTITY (1, 1) Primary key NOT NULL,
 UserID int
)

-- Output table variable
DECLARE @out TABLE
(
 rownum int IDENTITY (1, 1) Primary key NOT NULL,
 UserID int,
 ConcatText varchar(1000)
)

-- get distinct id's
INSERT INTO @ids(UserID)
SELECT DISTINCT(UserID) FROM #users

-- Foreach vars
declare @RowCnt int
declare @MaxRows int
select @RowCnt = 1
select @MaxRows=count(*) from @ids

-- UserID
declare @id int
declare @concattedtext varchar(1000)

-- process each id
while @RowCnt <= @MaxRows
begin
 SET @id = 0

 SELECT @id=UserID
 FROM @ids WHERE rownum=@RowCnt

 SET @concattedtext = CONVERT(nvarchar(50), @id)
 FROM @ids WHERE rownum=@RowCnt

 SELECT @concattedtext=coalesce(@concattedtext + '|', '') + Value
 FROM #users WHERE UserID=@id

 INSERT INTO @out(UserID, ConcatText)
 VALUES (@id, @concattedtext)

 -- next UserID
 Select @RowCnt = @RowCnt + 1
end

SELECT * FROM @out

DROP TABLE #users

结果:

rownum|UserID|ConcatTex
1     | 1    |1|attr1|attr2|attr3
2     | 2    |2|attr4
DROP TABLE #users

您可能需要一个排序字段来按要求的顺序获取参数。

多列

如果您希望获得包含多列的表,则您的数据需要具有相同的属性数。而你仍然需要注意订购。

在这种情况下,您可以选择带分组的硬编码查询。

答案 3 :(得分:0)

如果以这种方式保存数据,则需要执行交叉表查询并将行转移到列中。如果您使用的是Microsoft SQL Server,请在联机丛书中查看“交叉表查询”和数据透视运算符。