যদি ইতিবাচক হয় তবে সমস্ত আইটেম যোগ করুন। যদি নেতিবাচক হয় তবে প্রত্যেকে ফিরিয়ে দিন


28

আমি একটি উপায় খুঁজে বের করার প্রয়োজন করছি SUM()জন্য ইতিবাচক মূল্যবোধের সব numএবং রিটার্ন SUM()প্রতিটি ঋণাত্মক সংখ্যা জন্য সব ইতিবাচক সংখ্যা এবং একজন ব্যক্তি সারির। নীচে একটি নমুনা ডিডিএল দেওয়া হল:

Create Table #Be
(
    id int
    , salesid int
    , num decimal(16,4)
)

Insert Into #BE Values
    (1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00)
    , (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23)
    , (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32)

এবং এটি আমার কাঙ্ক্ষিত আউটপুট (প্রতিটি সেলসিডের জন্য ধনাত্মক সংখ্যা SUM()এবং নেতিবাচকগুলি পৃথক লাইন ফিরে পায়):

salesid    num
1          26.32
1          -13.00
2          47.35
3          -12.32
3          -43.23
3          -2.32

উত্তর:


26

এটা চেষ্টা কর:

SELECT   salesid, sum(num) as num
FROM     #BE
WHERE    num > 0
GROUP BY salesid
UNION ALL
SELECT   salesid, num
FROM     #BE
WHERE    num < 0;

যদি আপনি উভয় sumমান এক সারিতে চান তবে আপনাকে অবশ্যই একটি maxValue(এবং minValue) ফাংশন তৈরি করতে হবে এবং এটি হিসাবে sum(maxValue(0, num))এবং ব্যবহার করতে হবে sum(minValue(0, num))এটিতে বর্ণিত হয়েছে: এসকিউএল সার্ভারে কোনও ম্যাক্স ফাংশন রয়েছে যা .NET এ ম্যাথ.ম্যাক্সের মতো দুটি মান গ্রহণ করে?


8
আমি কোয়েরি ঠিক করেছি। UNION ALLপাশাপাশি প্রয়োজন UNION
ypercubeᵀᴹ

24

এটিও কাজ করে:

SELECT salesid, SUM(num)
FROM #BE
GROUP BY salesid, CASE WHEN num >= 0 THEN 0 ELSE id END;

অনুমিতি:

  • আইডি 1 থেকে শুরু হয়, সুতরাং এটি ব্যবহার করতে পারে THEN 0salesid ELSE salesid+id+1পাশাপাশি কাজ করবে
  • 0 কে ধনাত্মক সংখ্যা হিসাবে বিবেচনা করা হয়, সুতরাং >= 0( শূন্যটি ইতিবাচক বা নেতিবাচক? ) যদিও x+0=xএই =চিহ্নটি অপ্রয়োজনীয় বলে মনে হচ্ছে , এটি মনে রাখতে সহায়তা করে যে এই কেসটি ভুলে যায়নি এবং কীভাবে 0 পরিচালনা করা হয় (এসইউএম হিসাবে বা স্বতন্ত্র সারি হিসাবে)। যদি এর the SUM() of all positive numbersঅর্থ SUM of strictly positive numbers(অর্থাত> 0) =হয় তবে প্রয়োজন হয় না।

এটি অবশ্যই বাস্তব ডেটা এবং সূচী দিয়ে পরীক্ষা করা উচিত, তবে কেবল 1 টি টেবিল স্ক্যান দিয়ে কিছু ক্ষেত্রে পারফরম্যান্স কিছুটা ভাল হতে পারে।

একটি সূচীর অনুপস্থিতি নীচে পরীক্ষার ডেটাতে এই ক্যোয়ারির সাথে একটি ছোট প্রভাব ফেলেছে বলে মনে হচ্ছে:

SET NO COUNT ON
Create Table #Be(
  id int identity(0,1)
  ,salesid int,num decimal(16,4)
)
INSERT INTO #BE(salesid, num) 
SELECT CAST(rand()*10 as int), rand() - rand()
GO 10000 -- or 100.000

আপনি এই জাতীয় আইফির সাহায্যে আপনার গ্রুপ ধারাটি সহজ করতে পারেন: GROUP BY salesid, iif(num >= 0, 0, id) দুর্দান্ত ক্যোরি ।
ব্যবহারকারী 2023861

1
হ্যাঁ তবে ওপিকে প্রথমে এসকিউএল সার্ভার ২০১২ ইনস্টল করতে হবে। আইআইএফ এসকিউএল সার্ভার ২০১২: এমএসডিএন.মাইক্রোসফটকম /en-us/library/hh213574.aspx দিয়ে শুরু হয় । ওপি তার প্রশ্নটি এসকিউএল সার্ভার ২০০৮
জুলিয়ান ভাভসুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.