PDA

View Full Version : نمایش Rowهای یک Query در کنار هم



AAtoZZ
یک شنبه 12 تیر 1390, 09:55 صبح
فرض کنید Tableای به این شکل وجود داره




SentenceNo SequenceNo Word
1 1 Salam
1 2 Halet
1 3 Khobe?
1 4 Aghaye
2 1 Ali
2 2 Reza
2 3 Mohammadi


چطور میشه با Query کلمات هر جمله رو به ترتیب به هم متصل کرد و به این نتیجه رسید.



ُSalam Halet Khobe? Aghaye [S1]
Ali Reza Mohammadi [S2]]



اگر راهی به ذهنتون میرسه راهنمایی کنید.
چاره ای نباشه باید داخل برنامه (مثلا #C ) این کار رو انجام بدم که از جهت Resource پر هزینه است.:افسرده:

یوسف زالی
یک شنبه 12 تیر 1390, 10:35 صبح
سلام.
این رو تست کنید:




declare @t table(tID int, tData varchar(10))
insert into @t
values
(1,'salam '),
(1,'chetori '),
(2,'mersi '),
(1,'yousef?'),
(2,'azizam '),
(2,'khubam.')
declare @r table(rID int, rData varchar(100))
declare @x varchar(100)=''
declare @again bit= 1
declare @ID int= 0
while @again = 1
begin
set @ID =(
select distinct top 1 tID
from @t
where tID > @ID
order by tID
)
select @x = @x + tData
from @t
where tID = @ID
order by tID
insert into @r
select @ID, @x
where @ID is not null

select @again =@@ROWCOUNT,
@x =''
end
select*
from @r




خروجی :

1 salam chetori yousef?
2 mersi azizam khubam.

AAtoZZ
یک شنبه 12 تیر 1390, 11:09 صبح
تنها راهی که به ذهنم میرسید Curser بود.
خیلی ممنون از کمکتون.
من به کلمه ها ترتیب در یک جمله رو هم اضافه کردم تا موقعیتشون در جودل مهم نباشه.
موقع نمایش هم فاصله بین کلمات رو اضافه کردم


DECLARE @table table(tID int, SeqNo INT, tData varchar(10))

INSERT INTO @table values(1,3,'yousef?')
INSERT INTO @table values(1,1,'salam')
INSERT INTO @table values(1,2,'chetori')
INSERT INTO @table values(2,1,'mersi')
INSERT INTO @table values(2,2,'azizam')
INSERT INTO @table values(2,3,'khubam.')
-------------------------------------------------
DECLARE @temp table(rID int, rData varchar(100))

DECLARE @Sentence varchar(100)
SET @Sentence = ''

DECLARE @again BIT
SET @again = 1

DECLARE @ID INT
SET @ID = 0

WHILE @again = 1
BEGIN
SET @ID =(SELECT DISTINCT TOP 1 tID
FROM @table
WHERE tID > @ID
ORDER BY tID)

SELECT @Sentence = @Sentence + CASE WHEN @Sentence <> '' THEN SPACE(1) ELSE '' END + tData
FROM @table
WHERE tID = @ID
ORDER BY SeqNo

INSERT INTO @temp
SELECT @ID, @Sentence
WHERE @ID is not null

SELECT @again =@@ROWCOUNT,@Sentence =''
END
-------------------------------------------------
SELECT * FROM @temp

محمد سلیم آبادی
جمعه 17 تیر 1390, 20:07 عصر
اگه میخواهی با یک کوئری اینکار صورت بگیره و از نسخه ی 2005 به بالا بهرهمند هستین. راه ساده ForXmlPath هست که در مقاله زیر میتونید اونو پیدا کنید و با کمی تغییرات ازش استفاده کنید:
http://www.30sharp.com/article/13/214/11/%d8%a7%d9%84%d8%ad%d8%a7%d9%82-%d8%b3%d8%b7%d8%b1%d9%87%d8%a7%db%8c-%d8%ac%d8%af%d9%88%d9%84-concatenating-rows.aspx