ถ้าเป็นบวกให้รวมทุกรายการ หากลบให้คืนค่าแต่ละค่า


28

ฉันต้องการหาวิธีหาSUM()ค่าบวกทั้งหมดnumและคืนSUM()ค่าจำนวนบวกทั้งหมดและแถวแต่ละแถวสำหรับจำนวนลบแต่ละค่า ด้านล่างเป็นตัวอย่าง DDL:

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))สิ่งนี้อธิบายไว้ใน: มีฟังก์ชัน Max ใน SQL Server ที่รับค่าสองค่าเช่น Math.Max ​​ใน. 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;

สมมติฐาน:

  • Id เริ่มต้นที่ 1 THEN 0จึงจะสามารถใช้ salesid ELSE salesid+id+1ก็จะทำงานเช่นกัน
  • 0 ถือเป็นจำนวนบวกดังนั้นจึง>= 0( เป็นศูนย์บวกหรือลบ? ) แม้ว่าx+0=xดูเหมือนว่าจะทำให้=สัญญาณไม่จำเป็น แต่ก็ช่วยให้จำได้ว่ากรณีนี้ไม่ได้ถูกลืมและวิธีการจัดการ 0 (เช่น SUM หรือแถวแต่ละแถว) หาก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

คุณสามารถทำให้กลุ่มประโยคของคุณง่ายขึ้นด้วย iif ดังนี้: GROUP BY salesid, iif(num >= 0, 0, id) คำค้นหายอดเยี่ยม
user2023861

1
ใช่ แต่ OP จะมีการติดตั้งครั้งแรกของ SQL Server 2012 IIF เริ่มต้นกับ SQL Server 2012: msdn.microsoft.com/en-us/library/hh213574.aspx OP ได้ติดแท็กคำถามของเขากับ SQL Server 2008
Julien Vavasseur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.