2010-08-16 109 views
3

具有類似於將多個SQL字段組合成1個輸出行

的SQL表

用戶標識|屬性|值
1 |用戶名| Marius
1 |密碼| Fubar

我想創建一個輸出:

1 | Marius | Fubar

也許我太累了,看不出來,聽起來不太複雜,但我似乎無法弄清楚。任何幫助表示讚賞。

回答

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'; 
+0

在我的情況下非常短暫和工作的解決方案,非常感謝! – Marius 2010-08-17 09:19:26

0

編輯:

每個結果

一列:

如果您嘗試將多個屬性使用相同的用戶名結合起來會是這樣的:

短查詢(一個用戶名):

declare @concattedtext varchar(1000) 

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

SELECT @concattedtext 

結果和您的示例數據:

1 | Marius | Fubar 

全面查詢(所有用戶名的)

-- 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 [email protected] 

SET @concattedtext = CONVERT(nvarchar(50), @id) 
FROM @ids WHERE [email protected] 

SELECT @concattedtext=coalesce(@concattedtext + '|', '') + Value 
FROM #users WHERE [email protected] 

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 

您可能需要一個排序字段,以獲得您所要求的順序您的參數。

多列

數據需求,如果你想獲得一個表的多個列有屬性的相等計數。你仍然需要關心訂購。

在這種情況下,您可以選擇使用硬編碼查詢。

+0

對不起,這些下拉列表只是爲了分隔列。我的問題是,我想從兩行或更多行的字段返回一行 – Marius 2010-08-16 14:53:08

+0

但是,這是你需要做的 - 只要交換下行任何你想要的。你以前沒有提到這個事實。 – 2010-08-16 14:58:46

+0

所以 - 你需要得到一個兩列表或一個多列表?第二個是很難的。你需要做多個查詢來完成。例如。 sql while和UserId分組。請編輯您的問題以反映這些細節。 – 2010-08-16 17:23:39

1

會像...

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

是你在找什麼?

0

如果以這種方式保存數據,則需要執行交叉表查詢並將行轉換爲列。如果您使用的是Microsoft SQL Server,請在Books Online中查看「crosstab query」和pivot操作符。