একাধিক সারি দিয়ে এবং পূর্ববর্তী কমা ছাড়াই কীভাবে COALESCE ব্যবহার করবেন?


27

আমি নিম্নলিখিতগুলি অর্জন করার চেষ্টা করছি:

California | Los Angeles, San Francisco, Sacramento
Florida    | Jacksonville, Miami

দুর্ভাগ্যক্রমে, আমি "লস অ্যাঞ্জেলেস, সান ফ্রান্সিসকো, স্যাক্রামেন্টো, জ্যাকসনভিল, মিয়ামি" পাচ্ছি

আমি STUFF ফাংশনটি ব্যবহার করে আমার কাঙ্ক্ষিত ফলাফলগুলি অর্জন করতে পারি, তবে ভাবছিলাম যে এটি COALESCE ব্যবহার করে করার কোনও ক্লিনার উপায় আছে কিনা?

STATE       | CITY
California  | San Francisco
California  | Los Angeles
California  | Sacramento
Florida     | Miami
Florida     | Jacksonville 


DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + city
FROM tbl where city = 'California';
SELECT @col;

ধন্যবাদ

উত্তর:


45

এটি আপনার পরিচ্ছন্নতার পরে থাকতে পারে। মূলত, ভেরিয়েবলটি এখনও আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করে দেখুন। যদি তা না হয় তবে খালি স্ট্রিংটিতে সেট করুন এবং প্রথম শহর সংযুক্ত করুন (কোনও শীর্ষস্থানীয় কমা নেই)। যদি এটি থাকে তবে কমা যুক্ত করুন, তারপরে শহরটি যুক্ত করুন।

DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
  FROM dbo.tbl WHERE state = 'California';

অবশ্যই, এটি শুধুমাত্র প্রতি রাজ্যে একটি পরিবর্তনশীল পপুলিংয়ের জন্য কাজ করে। আপনি যদি একবারে প্রতিটি রাজ্যের জন্য তালিকাটি টানছেন তবে একটি শটে আরও ভাল সমাধান পাওয়া যাবে:

SELECT [state], cities = STUFF((
    SELECT N', ' + city FROM dbo.tbl
    WHERE [state] = x.[state]
    FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];

ফলাফল:

state       cities
----------  --------------------------------------
California  San Francisco, Los Angeles, Sacramento  
Florida     Miami, Jacksonville

প্রতিটি রাজ্যের মধ্যে শহরের নাম অনুসারে অর্ডার করতে:

SELECT [state], cities = STUFF((
    SELECT N', ' + city FROM dbo.tbl
    WHERE [state] = x.[state]
    ORDER BY city
    FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];

অ্যাজুরে এসকিউএল ডেটাবেস বা এসকিউএল সার্ভার 2017+ এ আপনি নতুন STRING_AGG()ফাংশনটি ব্যবহার করতে পারেন :

SELECT [state], cities = STRING_AGG(city, N', ')
  FROM dbo.tbl
  GROUP BY [state]
  ORDER BY [state];

এবং শহরের নাম অনুসারে অর্ডার করা:

SELECT [state], cities = STRING_AGG(city, N', ') 
                         WITHIN GROUP (ORDER BY city)
  FROM dbo.tbl
  GROUP BY [state]
  ORDER BY [state];

ধন্যবাদ হারুন আমার বর্তমান সমাধানটি আপনার কাছে সমান যেমন আমি গ্রুপের পরিবর্তে DISTINCT ব্যবহার করছি।
ব্যবহারকারী2732180

2
@ user2732180 আপনার দ্বারা একটি গ্রুপ ব্যবহার করা উচিত কারণ এটি প্রতি রাজ্যে একবার সম্মেলন সম্পাদন করার সম্ভাবনা বেশি। DISTINCT এর সাহায্যে এটি ক্যালিফোর্নিয়ার প্রতিটি উদাহরণের জন্য একই সমঝোতা প্রয়োগ করবে এবং কেবল তখনই সেগুলি অনুলিপি তৈরি করে এমন সমস্ত কাজ ফেলে দেবে।
অ্যারন বারট্র্যান্ড

6

উপরের হারুনের উত্তরে কেবল যুক্ত করতে ...

সচেতন হন যে ORDER BYকোনওটি আপনার ক্যোয়ারির শেষ আইটেমটি অন্তর্ভুক্ত করে ভেঙে যেতে পারে। আমার ক্ষেত্রে, আমি গ্রুপিং করছিলাম না, সুতরাং এটি কোনও পার্থক্য করে কিনা তা নিশ্চিত নই। আমি এসকিউএল 2014 ব্যবহার করছি my আমার ক্ষেত্রে আমার কাছে ভ্যালু 1, মান 2, মান 3 এর মতো কিছু আছে ... তবে ভেরিয়েবলটিতে আমার ফলাফলটি কেবল ভ্যালু 3 ছিল।


হারুন মন্তব্য করতে বলেছেন:

কানেক্টে কমপক্ষে চারবার এটি প্রতিবেদন করা হয়েছে:

  1. ফিল্টার ফলাফলের মাধ্যমে পরিবর্তনশীল কনটেনটেশন এবং অর্ডারে (যেখানে শর্ত যেমন)
  2. (এন) রেজাল্টসেট থেকে বার্তা বিল্ডিং ব্যর্থ হয় যখন অর্ডার বাই দ্বারা যুক্ত করা হয়
  3. ক্রস অ্যাপ্লিকেশন সহ একটি অর্ডার নির্বাচন থেকে স্থানীয় ভেরিয়েবল নির্ধারণ এবং একটি টেবিল-মূল্যযুক্ত ফাংশনটি কেবল সর্বশেষ মানটি প্রদান করে
  4. যখন একটি সারণী ভেরিয়েবল থেকে বর্ণ (সর্বোচ্চ) / এনভারচার (সর্বাধিক) মানগুলি যুক্ত করা হয়, কোনও অ প্রাথমিক-কী-কলাম দ্বারা ফিল্টারিং এবং অর্ডার দিলে ভুল ফলাফলগুলি ফিরে আসতে পারে

মাইক্রোসফ্ট থেকে প্রতিক্রিয়া উদাহরণ:

আপনি যে আচরণটি দেখছেন তা হ'ল ডিজাইন। অর্ডার বাই ক্লজ সহ প্রশ্নের ক্ষেত্রে অ্যাসাইনমেন্ট ক্রিয়াকলাপ (এই উদাহরণে কনটেনটেশন) ব্যবহারের অনির্ধারিত আচরণ রয়েছে।

প্রতিক্রিয়া এছাড়াও KB 287515 উল্লেখ করে:

পিআরবি: এক্সিকিউশন প্ল্যান এবং সমষ্টিগত কনটেনটেশন প্রশ্নের ফলাফলগুলি এক্সপ্রেশন অবস্থানের উপর নির্ভর করে

সমাধানটি হ'ল ব্যবহার করা FOR XML PATH(হারুনের উত্তরের দ্বিতীয় পদ্ধতির) যদি কনট্যাক্টেশন ক্রম গুরুত্বপূর্ণ এবং অবশ্যই, আপনি যদি সমস্ত মান অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হতে চান। আরও দেখুন:

এনভারচর কনটেনটেশন / ইনডেক্স / এনভারচার (সর্বাধিক) স্ট্যাক ওভারফ্লোতে অনির্বচনীয় আচরণ

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