ورود

View Full Version : تجمیع مقادیر یکسان



mehdi58
سه شنبه 23 آبان 1391, 10:02 صبح
سلام دوستان
فرض کنید جدولی داریم که شامل دو ستون زیر است.

http://up.irantrack.com/images/bk78sidkups9yklu3l.jpg

حالا می خواهیم Query ای بنویسیم که خروجی اش به صورت زیر باشد:

http://up.irantrack.com/images/muo7rau7b6z0h78zmiio.jpg

baktash.n81@gmail.com
سه شنبه 23 آبان 1391, 11:47 صبح
سلام می تونید از این روش استفاده کنید ... احتمالا بهترین روش نیست ....

select distinct(id),b from dbo.TestTable as t1 cross apply
(select Typ+',' from dbo.TestTable as t2 where t2.id=t1.id for xml path('')) temp(b)

mehdi58
سه شنبه 23 آبان 1391, 13:48 عصر
سلام می تونید از این روش استفاده کنید ... احتمالا بهترین روش نیست ....

select distinct(id),b from dbo.TestTable as t1 cross apply
(select Typ+',' from dbo.TestTable as t2 where t2.id=t1.id for xml path('')) temp(b)

با سپاس
اما با این روش باز هم به ازای هر ID فقط یک مقدار را با ویرگول بر می گرداند. چرا؟ نمی دانم!

baktash.n81@gmail.com
سه شنبه 23 آبان 1391, 15:38 عصر
من اینو تست کردم ... با جدولی که اون بالا گفتن ... ممکنه دقیقا ساختار جدولتون رو اینجا قرار بدید ... !

mehdi58
سه شنبه 23 آبان 1391, 16:16 عصر
من اینو تست کردم ... با جدولی که اون بالا گفتن ... ممکنه دقیقا ساختار جدولتون رو اینجا قرار بدید ... !


CREATE TABLE myTable (ID int,typ char(1))

INSERT myTable Values(1,'a')
INSERT myTable Values(1,'b')
INSERT myTable Values(1,'c')
INSERT myTable Values(2,'b')
INSERT myTable Values(2,'c')
INSERT myTable Values(3,'c')

و خروجی باید به صورت زیر باشد:

http://up.irantrack.com/images/87fqkvfimixepups4109.jpg

البته با عرض پوزش در پست قبلی نتیجه تصویر کوئری را اشتباه ارسال کرده بودم.

baktash.n81@gmail.com
سه شنبه 23 آبان 1391, 16:23 عصر
select distinct(id),b from dbo.myTable as t1 cross apply
(select typ+',' from dbo.myTable as t2 where t2.id=t1.id for xml path('')) temp(b)

من از SQL 2008 R2 استفاده می کنم شما نسخه SQL ات چی هست ؟

mehdi58
چهارشنبه 24 آبان 1391, 05:19 صبح
select distinct(id),b from dbo.myTable as t1 cross apply
(select typ+',' from dbo.myTable as t2 where t2.id=t1.id for xml path('')) temp(b)

من از SQL 2008 R2 استفاده می کنم شما نسخه SQL ات چی هست ؟

من از SQL 2005 استفاده می کنم.

mehdi.mousavi
چهارشنبه 24 آبان 1391, 06:14 صبح
سلام.
می تونیم اینکارو بدون استفاده از CROSS APPLY نیز بدین شکل انجام بدیم:

DECLARE @MyTable TABLE (
[Id] INT,
[Type] CHAR(1)
);

INSERT INTO @MyTable([Id], [Type])
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(2, 'a'),
(2, 'b'),
(3, 'c')

SELECT [Id],
SUBSTRING((
SELECT (', ' + [Type])
FROM @MyTable t2
WHERE
t1.[Id] = t2.[Id]
FOR XML PATH('')
), 3, 512) AS [Types]
FROM @MyTable t1
GROUP BY [Id]

که خروجی این خواهد بود:


1 a, b, c
2 a, b
3 c

موفق باشید.