ปัญหาผลรวมตารางข้อมูล

ฉันมีสถานการณ์

ฉันมีตารางข้อมูลที่มีคอลัมน์เครดิตและเดบิตเช่นนี้

Month     Credit     Debit
Sep       1422825      0
Oct         0        1422825
Oct       1695017.5    0
Nov         0         1400000
Nov         0         295018

อยากได้ยอดที่ควรแสดงแบบนี้

Month     Credit     Debit       Balance
Sep       1422825      0
Oct         0        1422825      (1422825 of Credit-1422825 of Debit)=0
Oct       1695017.5    0
Nov         0         1400000     
Nov         0         295018       (1695017.5 of credit-1400000+295018)=0.5

ควรแสดงในรายงานคริสตัลว่าต้องทำอย่างไร


person Fahad Mirza    schedule 14.06.2013    source แหล่งที่มา
comment
โปรดช่วยฉันทำสิ่งนี้   -  person Fahad Mirza    schedule 14.06.2013
comment
ต้องแสดงยอดสิ้นเดือนเท่านั้นหรือไม่ เช่นกรณีพ.ย.หรือต้องแสดงยอดทุกแถว   -  person शेखर    schedule 14.06.2013
comment
นี่คือปัญหาค่าที่กำลังดำเนินการอยู่ ดูสิ่งนี้ มันจะมีประโยชน์หากคุณระบุเวอร์ชันของเซิร์ฟเวอร์ SQL สำหรับการสอบ นี่มีไว้สำหรับ 2005.   -  person OzrenTkalcecKrznaric    schedule 14.06.2013
comment
เวอร์ชัน SQL ของฉันคือ 2008   -  person Fahad Mirza    schedule 14.06.2013
comment
สำหรับเชคาร์ ใช่ ฉันต้องการยอดคงเหลือของทุกเดือนแต่ต้องอยู่ก่อนเดบิต   -  person Fahad Mirza    schedule 14.06.2013
comment
โปรดดูคำตอบที่อัปเดต   -  person OzrenTkalcecKrznaric    schedule 14.06.2013


คำตอบ (1)


นี่คือโซลูชันของคุณที่ปรับให้เหมาะสมสำหรับปี 2548 ฉันแน่ใจว่าทำงานได้ดีในปี 2551 (ใช้จำนวนเต็มเป็นเดือนง่ายกว่า...)

DECLARE @Temp TABLE (Month int, Credit money, Debit money, Balance money)

DECLARE @RunningTotal money

SET @RunningTotal = 0

INSERT INTO @Temp
SELECT Month, Credit, Debit, null
FROM Datatable
ORDER BY Month

UPDATE @Temp
SET @RunningTotal = Balance = @RunningTotal + Credit - Debit
FROM @Temp

SELECT * FROM @Temp

แก้ไข (ต่อจากขั้นตอนแรก):

หากคุณต้องการแสดงเฉพาะผลรวมล่าสุดในกลุ่ม (เดือน) คุณสามารถใช้ฟังก์ชันการจัดอันดับ เช่น...

;WITH Temp2 AS
(
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY Month
            ORDER BY Credit DESC, Debit DESC -- whatever order inside group you need
        ) AS N
     FROM @Temp
)
SELECT
    Month,
    Credit, 
    Debit, 
    Balance = CASE WHEN N = 1 THEN Balance ELSE NULL END
FROM Temp2

นี่ไม่ใช่การทดสอบ รหัสที่เขียนโดยตรงจากหัวของฉัน :P

person OzrenTkalcecKrznaric    schedule 14.06.2013
comment
เรียน Ozren ขอบคุณสำหรับคำตอบของคุณ มันมีประโยชน์จริงๆ แต่ที่รัก ฉันไม่ต้องการรับผลรวมสะสม แต่ฉันต้องการยอดคงเหลือของทุกเดือนแทน โปรดตรวจสอบคำถามของฉันอีกครั้ง ขอบคุณพระเจ้าอวยพรคุณจริงๆ - person Fahad Mirza; 14.06.2013
comment
คำถามของคุณดูเหมือนว่าคุณต้องการทุกแถว ไม่ใช่หนึ่งแถวต่อเดือน หากคุณต้องการหนึ่งแถวต่อเดือน คุณต้องใช้ผลรวมทั่วไป + กลุ่มตามเดือน - person OzrenTkalcecKrznaric; 14.06.2013
comment
เรียน Ozren ฉันสามารถใช้ LINQ ได้ไหม - person Fahad Mirza; 14.06.2013
comment
มีร์ซา นั่นไม่ใช่คำถาม และฉันขอแนะนำให้เปิดคำถามอื่นหากยังไม่ได้ถาม คุณสามารถประเมินค่าการรันได้โดยใช้ LINQ และมีวิธีแก้ไขเกี่ยวกับ SO ที่นี่: http://stackoverflow.com/questions/1834753/linq-to-sql-and-a-running-total-on-สั่งผลลัพธ์ - person OzrenTkalcecKrznaric; 14.06.2013