দুটি নির্বাচনের বিবৃতি ফলাফল যোগদান করুন


174

SELECTএক বিবৃতিতে 2 বর্গক্ষেত্রের বিবৃতিতে কী ফলাফল পাওয়া সম্ভব ? আমার কাছে কার্যগুলির একটি ডাটাবেস রয়েছে যেখানে প্রতিটি রেকর্ডের একটি পৃথক কার্য, সময়সীমা সহ (এবং একটি PALT, যা INTশুরু থেকে শেষ সময়সীমা থেকে মাত্র কয়েকদিন পরে Ageথাকে also এছাড়াও INTবেশ কয়েকটি দিন is )

আমি একটি টেবিল রাখতে চাই যাতে প্রতিটি টেবিলে প্রতিটি ব্যক্তি থাকে, তাদের কতগুলি কার্য সম্পাদনের সংখ্যা রয়েছে এবং তাদের কতগুলি LATEকার্যের সংখ্যা রয়েছে (যদি থাকে তবে)

আমি সহজেই আলাদা আলাদা টেবিলগুলিতে এই ডেটা পেতে পারি:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks

তথ্য ফিরিয়ে দেওয়া:

ks        # Tasks
person1   7
person2   3

এবং তারপরে আমার কাছে রয়েছে:

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

যা প্রত্যাবর্তন করে:

ks        # Late
person1   1
person2   1

এবং আমি এই দুটি selectবিবৃতিতে ফলাফলের সাথে যোগ দিতে চাই (দ্বারা KS)

আমি একটি টেম্প টেবিল ব্যবহার এড়াতে চেষ্টা করছি, তবে এটি করার একমাত্র ব্যবহারিক উপায় যদি, আমি এই ফ্যাশনে টেম্প টেবিল ব্যবহার সম্পর্কে আরও জানতে চাই।

আমি কয়েকটি ধরণের count()সারি করার চেষ্টা করেছি যা শর্তসাপেক্ষে সন্তুষ্ট হয় তবে কীভাবে এটি করা যায় তা আমি বুঝতে পারি না। যদি এটি সম্ভব হয় তবে তাও কার্যকর হবে।

সংযোজন: দুঃখিত, আমি চাই আমার ফলাফলের জন্য কলাম আছে KS, TasksএবংLate

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)

অতিরিক্তভাবে, আমি চাই যে কোনও ব্যক্তির দেরি না করা সত্ত্বেও তারা প্রদর্শিত হবে show

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
ভাল উত্তর দেয়, এই উত্তরের জন্য ধন্যবাদ!

দুটি নির্বাচিত বিবৃতিও কাজ করে, এগুলিতে LEFT JOINযোগদানের জন্য একটি ব্যবহার করে এটিও কাজ করে এবং আমি এখন বুঝতে পারি কীভাবে selectএই ফ্যাশনটিতে একাধিক এসগুলিতে যোগদান করা যায়


আপনি প্রত্যাশিত ফলাফলের উদাহরণ দেন নি। কিছু উত্তর তাই সিদ্ধান্তযুক্ত ফলাফল। কেউ কেউ যোগ দিচ্ছেন। তুমি কোনটি চাও?
ফিল

দুঃখিত, আমি চাই যে আমার ফলাফলগুলিতে কেএস, টাস্কস এবং লেট কেএসের # কলাম # দেরী ব্যক্তি 1 7 1 ব্যক্তি 2 3 1 ব্যক্তি3 2 0 (বা নাল) অতিরিক্তভাবে, আমি চাই যে কোনও ব্যক্তির দেরীতে কোন কাজ না থাকলেও তারা প্রদর্শিত হবে । একটি বাম যোগদানের সাথে দুটি নির্বাচিত বিবৃতি পদ্ধতিটি ব্যবহার করে বর্তমানে এটি অর্জন করা (প্রস্তাবিত অন্তর্ভুক্ত যোগদানের বিপরীতে, যা কাজ করে তবে দেরী না করা ব্যক্তিদের দেখায় না কারণ তারা দ্বিতীয় নির্বাচনতে উপস্থিত না থাকায় দেরীতেও এ অর্জন করা হয়) কলামটি হচ্ছে সুম (কেস যখন বয়স> প্যাল্ট তারপরে 1 ইলএসি 0 শেষ) মরহুম
syververfy

উত্তর:


264
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);

1
এটি ভালভাবে কাজ করে, যদিও আমি নির্দিষ্ট করেছিলাম না যে আমি একটি বাম যোগদান করতে চাই যাতে রেকর্ডগুলি প্রদর্শিত হয় যদিও তাদের 0 দেরীতে কাজ রয়েছে।
sylverfyre

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

দুর্দান্ত উত্তর, তবে কেউ কি বলতে পারবেন যে এই ধরণের 'সমাধান' ব্যয়বহুল হিসাবে বিবেচিত হয় বা এটি আপনি কী ব্যবহার করছেন তার উপর নির্ভর করে?
পেট্রোসমি

71

এরকম কিছু চেষ্টা করুন:

SELECT 
* 
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1 
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks

4
আমি কাজের গ্রহণযোগ্য উত্তর পেতে পারি না, তবে এটি আমার প্রয়োজনের জন্য দুর্দান্ত কাজ করেছে। ধন্যবাদ।
বেনভেঙ্কার

কবজির মতো কাজ করেছেন। যতদূর আমি উদ্বিগ্ন এটি হ'ল গ্রহণযোগ্য উত্তর। ধন্যবাদ।
নোকডিব

আমার জন্য কাজ! ধন্যবাদ! আমি একাধিক ক্যোয়েরি (একাধিক যোগদান) ব্যবহার করার চেষ্টাও করেছি এবং এটিও দুর্দান্ত। যদি কেউ ভাবছেন যে আপনি উদাহরণের মধ্যে শেষ "চালু" এর পরে আরও জোড় যোগ করতে পারেন এবং অনুক্রমটি ব্যবহার করে চালিয়ে যেতে পারেন: অন .... এক্স জোইন (QUERY এন -1) ওয়ান = জেডএক্স যোগ (QUERY এন) ওয়ান = জেড
সিজারমার্ট

43

ব্যবহার UNION:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

অথবা UNION ALLআপনি যদি সদৃশ চান:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

3
ইউনিয়ন বা ইউনিয়ন সকলের ফলাফল হিসাবে মাত্র 2 টি কলাম থাকবে। যেখানে তিনি তাদের মধ্যে 3 চান
সুরজ এস

14

যদি বয়স এবং পল্ট একই টেবিলের কলাম হয়, আপনি সমস্ত কাজ গণনা করতে পারেন (*) এবং এই জাতীয় লেটগুলি কেবল যোগ করতে পারেন:

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks

1
এটি হ'ল ঠিক কী আমি চেয়েছিলাম তবে এটি কীভাবে সন্ধান করবে তা জানতাম না। আমি কোনও এসইএম (CASE) ব্যবহার করার কথা ভাবি নি - ধন্যবাদ।
sylverfyre

13

আপনি UNION ALLএটির জন্য কীওয়ার্ডটি ব্যবহার করতে পারেন ।

এটি টিএস-এসকিউএলে করার জন্য এখানে এমএসডিএন ডক রয়েছে http://msdn.microsoft.com/en-us/library/ms180026.aspx

ইউনিয়ন সব - ফলাফল সেট একত্রিত

ইউনিয়ন- একটি সেট ইউনিয়নের মতো কিছু করে এবং আউটপুট সদৃশ মানগুলি করে না

উদাহরণের সাথে পার্থক্যের জন্য: http://sql-plsql.blogspot.in/2010/05/differences-between-union-union-all.html

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