এসকিউএল সার্ভারে স্ট্রিংগুলি সংযুক্ত করতে গ্রুপের মাধ্যমে কীভাবে ব্যবহার করবেন?


373

কিভাবে আমি পাব:

id       Name       Value
1          A          4
1          B          8
2          C          9

প্রতি

id          Column
1          A:4, B:8
2          C:9

18
এই ধরণের সমস্যাটি মাইএসকিউএলে তার GROUP_CONCAT()সামগ্রিক ফাংশন সহ সহজেই সমাধান করা হয় তবে মাইক্রোসফ্ট এসকিউএল সার্ভারে এটি সমাধান করা আরও বিশ্রী। সহায়তার জন্য নিম্নলিখিত এসও প্রশ্নটি দেখুন: " সম্পর্কের ভিত্তিতে একটি রেকর্ডের বিপরীতে একাধিক রেকর্ড কীভাবে পাবেন? "
বিল কারভিন

1
মাইক্রোসফ্ট অ্যাকাউন্টের প্রত্যেককে সংযোগের সহজ সমাধানের জন্য ভোট দেওয়া উচিত: সংযুক্ত.মাইক্রোসফট
এসকিউএল সার্ভার/feedback/details

1
টি-এসকিউএল উন্নত না হওয়া পর্যন্ত আপনি বিকল্প হিসাবে এখানে পাওয়া এসকিউএলসিআরআর সমষ্টিগুলি ব্যবহার করতে পারেন: groupconcat.codeplex.com
অরল্যান্ডো কোলামাটিও

উত্তর:


550

কোনও কার্সর, WHILE লুপ বা ব্যবহারকারী-সংজ্ঞায়িত ফাংশন প্রয়োজন

ফরএম এক্সএমএল এবং পথের সাথে সৃজনশীল হওয়া দরকার।

[দ্রষ্টব্য: এই সমাধানটি কেবল এসকিউএল 2005 এবং তার পরে কাজ করে। মূল প্রশ্নটি ব্যবহারের সংস্করণটি নির্দিষ্ট করে নি]]

CREATE TABLE #YourTable ([ID] INT, [Name] CHAR(1), [Value] INT)

INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'A',4)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'B',8)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)

SELECT 
  [ID],
  STUFF((
    SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) 
    FROM #YourTable 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,2,'') AS NameValues
FROM #YourTable Results
GROUP BY ID

DROP TABLE #YourTable

6
কেউ কেন একটি টেম্প টেবিল দুলিয়ে দেবে?
অ্যামি বি

3
এটি আমার জীবনের সবচেয়ে দুর্দান্ত এসকিউএল জিনিস। বড় ডেটা সেটগুলির জন্য এটি "দ্রুত" হলে কোনও ধারণা? এটি কার্সার বা এমন কিছুর মতো ক্রল শুরু করে না, তাই না? আমি আশা করি আরও বেশি লোক এই ক্রেজিটিকে ভোট দেবে।
ব্যবহারকারী 12861

6
অঁ্যা। আমি এটির সাব-কোয়েরি স্টাইলটি ঘৃণা করি। জয়েনগুলি এত সুন্দর। শুধু মনে হয় না যে আমি এই সমাধানটিতে এটি ব্যবহার করতে পারি। যাইহোক, আমি এখানে এসকিউএল ডার্কগুলি রয়েছে এমন আমার কাছ থেকে কে দেখে পছন্দ করি যারা এই জাতীয় জিনিসগুলি শেখার পছন্দ করে। আপনারা সবাইকে কুতোস :)
কেভিন ফেয়ারচাইল্ড

6
স্ট্রিং ম্যানিপুলেশনটি করার একটি সামান্য পরিষ্কার উপায়: স্টুফএফ ((নির্বাচন করুন ',' + [নাম] + ':' এক্সএএমএল এর জন্য # আপনার টেবিল হ'ল (আইডি = ফলাফল.আইডি) থেকে স্ট্যাটাস ([মান]] পাঠ ('')), 1,2, '') এএস নেমভ্যালুস
জোনাথন

3
আমি খুঁজে পেয়েছি কিছু নোট করুন। এমনকি কোনও ক্ষেত্রে সংবেদনশীল পরিবেশেও, ক্যোয়ারির মূল মূল্যটি নীচের ক্ষেত্রে হওয়া দরকার। আমি অনুমান করছি এটি কারণ এটি এক্সএমএল, এটি কেস সংবেদনশীল
জলোপা

136

এটি যদি এসকিউএল সার্ভার 2017 বা এসকিউএল সার্ভার ভিনেক্সট হয়, এসকিউএল অ্যাজুরি আপনি নীচে হিসাবে স্ট্রিং_এজি ব্যবহার করতে পারেন:

select id, string_agg(concat(name, ':', [value]), ', ')
    from #YourTable 
    group by id

নির্দোষ কাজ করে!
আরগো

1
এটি দুর্দান্ত কাজ করে, তাহলে গ্রহণযোগ্য উত্তরটি আরও ভাল।
জান্নিক ব্রুনিস

51

এক্সএমএল পাথটি ব্যবহার করা আপনার প্রত্যাশা মতো পুরোপুরি একত্রী হতে পারে না ... এটি "&" এর সাথে "& amp" প্রতিস্থাপন করবে; এবং এছাড়াও গণ্ডগোল হবে <" and "> ... সম্ভবত কিছু অন্যান্য জিনিস, নিশ্চিত নয় ... তবে আপনি এটি চেষ্টা করতে পারেন

আমি এটির জন্য একটি পরিশ্রম জুড়ে এসেছি ... আপনাকে প্রতিস্থাপন করতে হবে:

FOR XML PATH('')
)

সঙ্গে:

FOR XML PATH(''),TYPE
).value('(./text())[1]','VARCHAR(MAX)')

... বা NVARCHAR(MAX)যদি আপনি যা ব্যবহার করছেন তা যদি হয়।

কেন জাহান্নামের SQLএকত্রীকৃত কার্যকারিতা নেই? এটি একটি পিটিএ


2
আউটপুটটি এনকোড না করার সর্বোত্তম উপায়ের সন্ধান করে আমি নেটটি ছড়িয়েছি। তোমাকে অনেক ধন্যবাদ! এটিই একটি চূড়ান্ত উত্তর - যতক্ষণ না এমএস একটি কনক্যাট () সমষ্টিগত ফাংশনের মতো এর জন্য যথাযথ সমর্থন যোগ করে। আমি যা করি তা হ'ল এটি আউটার-প্রয়োগের মধ্যে ফেলে দেয় যা আমার জমাটযুক্ত ক্ষেত্রটি দেয়। আমি আমার নির্বাচিত বিবৃতিগুলিতে নেস্টেড-সিলেক্টস যুক্ত করার অনুরাগী নই।
মাইকটিভি

আমি সম্মত হয়েছি, মানটি ব্যবহার না করেই আমরা এমন সমস্যাগুলির মধ্যে দৌড়াতে পারি যেখানে পাঠ্যটি একটি এক্সএমএল এনকোডেড অক্ষর। এসকিউএল সার্ভারে গ্রুপযুক্ত কনটেনটেশনের জন্য আমার ব্লগটি দৃশ্যের আচ্ছাদন সন্ধান করুন। blog.vcillusion.co.in/…
ভিসিলিউশন

40

যখন আমি স্ট্রিং স্পেস এবং বিশেষ এক্সএমএল অক্ষর (ধারণকারী সাথে কাজ করার জন্য কেভিন ফেয়ারচাইল্ড এর পরামর্শ রূপান্তর চেষ্টা আমি সমস্যার একটি দম্পতি গাড়ীতে আঘাত &, <, >) যা এনকোড করা হয়।

আমার কোডের চূড়ান্ত সংস্করণ (যা মূল প্রশ্নের উত্তর দেয় না তবে কারওর পক্ষে কার্যকর হতে পারে) এর মত দেখাচ্ছে:

CREATE TABLE #YourTable ([ID] INT, [Name] VARCHAR(MAX), [Value] INT)

INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'Oranges & Lemons',4)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'1 < 2',8)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)

SELECT  [ID],
  STUFF((
    SELECT ', ' + CAST([Name] AS VARCHAR(MAX))
    FROM #YourTable WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE 
     /* Use .value to uncomment XML entities e.g. &gt; &lt; etc*/
    ).value('.','VARCHAR(MAX)') 
  ,1,2,'') as NameValues
FROM    #YourTable Results
GROUP BY ID

DROP TABLE #YourTable

স্থানকে একটি ডিলিমিটার হিসাবে ব্যবহার করার পরিবর্তে এবং সমস্ত স্পেসকে কমা দিয়ে প্রতিস্থাপনের পরিবর্তে, এটি প্রতিটি মানকে একটি কমা এবং স্পেসকে পূর্ব-পেন্ড করে তারপর STUFFপ্রথম দুটি অক্ষর অপসারণ করতে ব্যবহার করে।

এক্সএমএল এনকোডিং টিওয়াইপিই নির্দেশিকা ব্যবহার করে স্বয়ংক্রিয়ভাবে যত্ন নেওয়া হয় ।


21

এসকিএল সার্ভার 2005 এবং তারপরে ব্যবহার করে অন্য একটি বিকল্প

---- test data
declare @t table (OUTPUTID int, SCHME varchar(10), DESCR varchar(10))
insert @t select 1125439       ,'CKT','Approved'
insert @t select 1125439       ,'RENO','Approved'
insert @t select 1134691       ,'CKT','Approved'
insert @t select 1134691       ,'RENO','Approved'
insert @t select 1134691       ,'pn','Approved'

---- actual query
;with cte(outputid,combined,rn)
as
(
  select outputid, SCHME + ' ('+DESCR+')', rn=ROW_NUMBER() over (PARTITION by outputid order by schme, descr)
  from @t
)
,cte2(outputid,finalstatus,rn)
as
(
select OUTPUTID, convert(varchar(max),combined), 1 from cte where rn=1
union all
select cte2.outputid, convert(varchar(max),cte2.finalstatus+', '+cte.combined), cte2.rn+1
from cte2
inner join cte on cte.OUTPUTID = cte2.outputid and cte.rn=cte2.rn+1
)
select outputid, MAX(finalstatus) from cte2 group by outputid

ইনপুটটির জন্য ধন্যবাদ, আমি সবসময় এসকিউএল সার্ভারে সমস্যা সমাধানের জন্য সিটিই এবং পুনরাবৃত্ত সিটিই ব্যবহার করতে পছন্দ করি। এটি আমার জন্য দুর্দান্ত কাজ করে!
gbdavid

এটি কি বাইরের প্রয়োগের সাথে কোনও প্রশ্নের ক্ষেত্রে ব্যবহার করা সম্ভব?
গর্তে আগুন fire

14

Http://groupconcat.codeplex.com থেকে এসকিউএলসিআরআর সমষ্টিগুলি ইনস্টল করুন

তারপরে আপনি যে ফলাফলটি চেয়েছিলেন তা পেতে আপনি এই জাতীয় কোড লিখতে পারেন:

CREATE TABLE foo
(
 id INT,
 name CHAR(1),
 Value CHAR(1)
);

INSERT  INTO dbo.foo
    (id, name, Value)
VALUES  (1, 'A', '4'),
        (1, 'B', '8'),
        (2, 'C', '9');

SELECT  id,
    dbo.GROUP_CONCAT(name + ':' + Value) AS [Column]
FROM    dbo.foo
GROUP BY id;

আমি কয়েক বছর আগে এটি ব্যবহার করেছি, সিনট্যাক্সটি সমস্ত "এক্সএমএল পাথ" ট্রিকগুলির চেয়ে অনেক ক্লিনার এবং এটি খুব ভালভাবে কাজ করে। এসকিউএল সিএলআর ফাংশন যখন বিকল্প হয় আমি তা দৃ strongly়ভাবে সুপারিশ করি।

12

এসকিউএল সার্ভার ২০০৫ এবং পরে আপনাকে নিজের কাস্টম সমষ্টিগত ফাংশনগুলি তৈরি করার অনুমতি দেয় , এতে কনটেনটেশন-এর মতো জিনিসগুলি যুক্ত রয়েছে - লিঙ্কযুক্ত নিবন্ধের নীচে নমুনাটি দেখুন।


4
দুর্ভাগ্যক্রমে এর জন্য (?) সিএলআর

1
কেবল উদাহরণটি আসল কনটেন্টেশন বাস্তবায়নের জন্য সিএলআর ব্যবহার করে তবে এটির প্রয়োজন হয় না। আপনি এক্সএমএলের জন্য কনক্যাটেনশন সামগ্রিক ফাংশনটি ব্যবহার করতে পারেন তাই ভবিষ্যতে এটি কল করার জন্য এটি কমপক্ষে আরও শুভ!
শিব

12

আট বছর পরে ... মাইক্রোসফ্ট এসকিউএল সার্ভার vNext ডেটাবেস ইঞ্জিন অবশেষে সরাসরি গোষ্ঠীযুক্ত স্ট্রিং উপসংহার সমর্থন করার জন্য লেনদেন-এসকিউএল বাড়িয়েছে। সম্প্রদায়টির প্রযুক্তিগত পূর্বরূপ সংস্করণ ১.০ STRING_AGG ফাংশন যুক্ত করেছে এবং সিটিপি 1.1 এ STRING_AGG ফাংশনের জন্য WITHIN GROUP ধারা যুক্ত করেছে।

তথ্যসূত্র: https://msdn.microsoft.com/en-us/library/mt775028.aspx


9

এটি কেভিন ফেয়ারচাইল্ডের পোস্টের (কেবল উপায় দ্বারা খুব চালাক) একটি সংযোজন। আমি এটি একটি মন্তব্য হিসাবে যোগ করতে হবে, কিন্তু আমার এখনও পর্যাপ্ত পয়েন্ট নেই :)

আমি এই ধারণাটি আমি যে দৃশ্যে কাজ করছি তার জন্য ব্যবহার করছিলাম, তবে যে আইটেমগুলিতে আমি একত্রিত হয়েছি সেখানে স্পেস রয়েছে। সুতরাং আমি ডিলিমিটার হিসাবে স্পেস ব্যবহার না করার জন্য কোডটি কিছুটা সংশোধন করেছি।

আবার ধন্যবাদ কুল কাজের জন্য কেভিন!

CREATE TABLE #YourTable ( [ID] INT, [Name] CHAR(1), [Value] INT ) 

INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (1, 'A', 4) 
INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (1, 'B', 8) 
INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (2, 'C', 9) 

SELECT [ID], 
       REPLACE(REPLACE(REPLACE(
                          (SELECT [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) as A 
                           FROM   #YourTable 
                           WHERE  ( ID = Results.ID ) 
                           FOR XML PATH (''))
                        , '</A><A>', ', ')
                ,'<A>','')
        ,'</A>','') AS NameValues 
FROM   #YourTable Results 
GROUP  BY ID 

DROP TABLE #YourTable 

9

একটি উদাহরণ হবে

ওরাকলে আপনি তালিকাবদ্ধ সমষ্টি ফাংশনটি ব্যবহার করতে পারেন।

আসল রেকর্ড

name   type
------------
name1  type1
name2  type2
name2  type3

SQL

SELECT name, LISTAGG(type, '; ') WITHIN GROUP(ORDER BY name)
FROM table
GROUP BY name

ফলাফল

name   type
------------
name1  type1
name2  type2; type3

6
দেখতে দুর্দান্ত লাগছে, তবে প্রশ্নগুলি বিশেষত ওরাকল সম্পর্কে নয়।
ব্যবহারকারী 12861

13
আমি বুঝেছি. তবে আমি ওরাকলের জন্য একই জিনিসটির সন্ধান করছিলাম, তাই আমি ভেবেছিলাম যে আমি আমার মতো অন্যান্য লোকদের জন্য এটি এখানে রাখব :)
মিশাল বি

@MichalB। আপনি কি সিনট্যাক্সের মধ্যে মিস করছেন না? উদাহরণস্বরূপ: গ্রুপের মধ্যে listagg (টাইপ, ',') নাম অনুসারে?
গ্রেগরি

@ গ্রেগরি: আমি আমার উত্তর সম্পাদনা করেছি। আমি মনে করি আমার পুরানো সমাধান দিনগুলিতে ফিরে কাজ করত। আপনার প্রস্তাবিত বর্তমান ফর্মটি নিশ্চিতভাবে কাজ করবে, ধন্যবাদ।
মিশাল বি

1
ভবিষ্যতের লোকদের জন্য - আপনি বিভিন্ন প্ল্যাটফর্মের মতো উল্লেখযোগ্য পার্থক্যের জন্য নিজের উত্তর দিয়ে একটি নতুন প্রশ্ন লিখতে পারেন
মাইক এম

7

এই ধরণের প্রশ্নটি এখানে প্রায়শই জিজ্ঞাসা করা হয় এবং সমাধানটি অন্তর্নিহিত প্রয়োজনীয়তার উপর অনেক বেশি নির্ভর করে:

https://stackoverflow.com/search?q=sql+pivot

এবং

https://stackoverflow.com/search?q=sql+concatenate

সাধারণত, গতিশীল এসকিএল, কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন বা কার্সার ছাড়াই এটি করার কোনও এসকিউএল-কেবল উপায় নেই।


2
সত্য না. সিটি: এস ব্যবহার করে সাইবারকিওয়ের দ্রবণটি কোনও বিক্রেতা-নির্দিষ্ট হ্যাকারি ছাড়াই খাঁটি এসকিএল।
বিজন লিন্ডকভিস্ট

1
প্রশ্নোত্তরের সময়, আমি পুনরাবৃত্ত সিটিইগুলিকে ভয়ঙ্করভাবে বহনযোগ্য হিসাবে গণনা করতাম না, তবে তারা এখন ওরাকল দ্বারা সমর্থিত। সেরা সমাধানটি প্ল্যাটফর্মের উপর নির্ভর করতে চলেছে। এসকিউএল সার্ভারের ক্ষেত্রে এটি সম্ভবত এক্সএমএল কৌশল বা গ্রাহক সিএলআর সমষ্টিগত।
কেড রক্স

1
সব প্রশ্নের চূড়ান্ত উত্তর? stackoverflow.com/search?q=[whatever প্রশ্ন]
Junchen লিউ

7

কেবল ক্যাড যা বলেছেন তাতে যুক্ত করার জন্য, এটি সাধারণত একটি ফ্রন্ট-এন্ড ডিসপ্লে জিনিস এবং তাই সেখানে পরিচালনা করা উচিত। আমি জানি যে কখনও কখনও ফাইল এক্সপোর্ট বা অন্যান্য "এসকিউএল কেবলমাত্র" সমাধানগুলির মতো জিনিসগুলির জন্য এসকিউএলে 100% কিছু লেখা সহজ হয় তবে বেশিরভাগ সময় এই প্রদর্শনীর স্তরটি আপনার প্রদর্শন স্তরে পরিচালনা করা উচিত।


11
গ্রুপিং এখন একটি ফ্রন্ট-এন্ড ডিসপ্লে জিনিস? গোষ্ঠীভিত্তিক ফলাফলের সেটে একটি কলামকে সম্মতি জানাতে প্রচুর বৈধ পরিস্থিতি রয়েছে।
এমজিওউইন

5

কার্সারের দরকার নেই ... কিছুক্ষণ লুপই যথেষ্ট is

------------------------------
-- Setup
------------------------------

DECLARE @Source TABLE
(
  id int,
  Name varchar(30),
  Value int
)

DECLARE @Target TABLE
(
  id int,
  Result varchar(max) 
)


INSERT INTO @Source(id, Name, Value) SELECT 1, 'A', 4
INSERT INTO @Source(id, Name, Value) SELECT 1, 'B', 8
INSERT INTO @Source(id, Name, Value) SELECT 2, 'C', 9


------------------------------
-- Technique
------------------------------

INSERT INTO @Target (id)
SELECT id
FROM @Source
GROUP BY id

DECLARE @id int, @Result varchar(max)
SET @id = (SELECT MIN(id) FROM @Target)

WHILE @id is not null
BEGIN
  SET @Result = null

  SELECT @Result =
    CASE
      WHEN @Result is null
      THEN ''
      ELSE @Result + ', '
    END + s.Name + ':' + convert(varchar(30),s.Value)
  FROM @Source s
  WHERE id = @id

  UPDATE @Target
  SET Result = @Result
  WHERE id = @id

  SET @id = (SELECT MIN(id) FROM @Target WHERE @id < id)
END

SELECT *
FROM @Target

দেখুন: লাথি
মারার

@ মার্কস সম্ভবত আরও ভাল সমালোচনা হ'ল প্রাথমিক কীটি টেবিলের ভেরিয়েবলগুলিতে ঘোষণা করা উচিত।
অ্যামি বি

@মার্ক_স আরও পরিদর্শন করার পরে, নিবন্ধটি লজ্জাজনক - যেমন আইও পরিমাপ ছাড়াই পারফরম্যান্সের প্রায় সমস্ত আলোচনা রয়েছে। আমি ল্যাগ সম্পর্কে শিখেছি - তাই এর জন্য ধন্যবাদ।
অ্যামি বি

4

আসুন খুব সহজ:

SELECT stuff(
    (
    select ', ' + x from (SELECT 'xxx' x union select 'yyyy') tb 
    FOR XML PATH('')
    )
, 1, 2, '')

এই লাইনটি প্রতিস্থাপন করুন:

select ', ' + x from (SELECT 'xxx' x union select 'yyyy') tb

আপনার প্রশ্নের সাথে।


3

কোনও ক্রস উত্তরগুলি প্রয়োগ করে না, এক্সএমএল উত্তোলনেরও প্রয়োজন নেই। কেভিন ফেয়ারচাইল্ড যা লিখেছিলেন তার কিছুটা আলাদা সংস্করণ এখানে। আরও জটিল প্রশ্নগুলিতে এটি ব্যবহার করা আরও দ্রুত এবং সহজ:

   select T.ID
,MAX(X.cl) NameValues
 from #YourTable T
 CROSS APPLY 
 (select STUFF((
    SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX))
    FROM #YourTable 
    WHERE (ID = T.ID) 
    FOR XML PATH(''))
  ,1,2,'')  [cl]) X
  GROUP BY T.ID

1
মান ব্যবহার না করেই আমরা এমন সমস্যায়
পড়তে পারি

2

গোষ্ঠীটির মধ্যে বেশিরভাগই একটি আইটেম থাকে তবে আপনি নিম্নলিখিত উপায়ে পারফরম্যান্সকে উন্নত করতে পারেন:

SELECT 
  [ID],

CASE WHEN MAX( [Name]) = MIN( [Name]) THEN 
MAX( [Name]) NameValues
ELSE

  STUFF((
    SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) 
    FROM #YourTable 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,2,'') AS NameValues

END

FROM #YourTable Results
GROUP BY ID

ধরে নিচ্ছি আপনি তালিকায় নকল নাম চান না, যা আপনি হয়ত বা নাও করতে পারেন।
jnm2

1

রিপ্লেস ফাংশন এবং জসন পাঠের জন্য ব্যবহার করে

SELECT T3.DEPT, REPLACE(REPLACE(T3.ENAME,'{"ENAME":"',''),'"}','') AS ENAME_LIST
FROM (
 SELECT DEPT, (SELECT ENAME AS [ENAME]
        FROM EMPLOYEE T2
        WHERE T2.DEPT=T1.DEPT
        FOR JSON PATH,WITHOUT_ARRAY_WRAPPER) ENAME
    FROM EMPLOYEE T1
    GROUP BY DEPT) T3

নমুনা ডেটা এবং আরও উপায়ের জন্য এখানে ক্লিক করুন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.