YetAnotherForum
სალამი სტუმარს ძებნა | აქტიური თემები | შესვლა | რეგისტრაცია

ფავორიტებში დამატება
ნაშთების დათვლა ნაზარდი ჯამით
vajaGM Offline
#1 Posted : Saturday, May 01, 2010 4:57:15 PM

Rank: Administration

Medals:

Groups: Administrators
Joined: 10/20/2012
Posts: 106
Points: 327
Location: Tbilisi

Thanks: 0 times
Was thanked: 0 time(s) in 0 post(s)
-- Version : SQL Server 2005,2008

ხშირად ფინანსურ ამოცანებში საჭიროა ნაშთების დათვლა ნაზარდი ჯამებით.
ასეთი შეიძლება იყოს : ამონაწერი ანალიზური ანგარიშის ბრუნვებიდან (პირადი ბარათი), საწყობში საქონლის ნაშთის დათვლა ყოველი ბრუნვის დროს და სხვა..
ამ ამოცანის გადასაწყვეტად ხშირად იყენებენ Stored Procedure-ებს, რომელშიც ქმნიან დროებით ცხრილებს, კურსორებს, ციკლში აბრუნებენ მონაცემებს და
ამ გზით გამოითვლიან ნაშთებს. რაც ძალიან მოუხერხებელია, ნელია და არაპრაქტიკული.
მითუმეტეს, რომ ყოველივე ამის მიღწევა თავისუფლადაა შესაძლებელი Inline table valued ფუნქციების გამოყენებით.

გთავაზობთ მარტივ მაგალითს, თუ როგორ უნდა მოხდეს ამ ამოცანის გადაწყვეტა ერთი მარტივი Select-ის გამოყენებით:

BB კოდი:

-- გამოვაცხადოთ საწყისი ცხრილი და შევავსოთ მონაცემები
----------------------------------------------------------
DECLARE @tmp TABLE (nID INT IDENTITY, nVal INT)
INSERT INTO @tmp VALUES (1),(3),(4),(7),(-7),(-4),(5),(10),(-9)

-- დავთვალოთ ნაშთები ნაზარდი ჯამებით
----------------------------------------------------------

-- მეთოდი 1
SELECT     ID, y.nVal, y.nVal +
                          (SELECT     ISNULL(SUM(x.nVal), 0) AS [sum]
                            FROM          (SELECT     ROW_NUMBER() OVER(ORDER BY nID ASC) AS ID, *
                                                    FROM          @tmp) AS x
                            WHERE      (ID < y.ID)) AS Rem
FROM         (SELECT     ROW_NUMBER() OVER(ORDER BY nID ASC) AS ID, *
                       FROM          @tmp) AS y;

-- მეთოდი 2
WITH q([ID], nVal, Rem) AS (SELECT     nID, nVal, ROW_NUMBER()OVER(ORDER BY nID) AS rem
                                                            FROM         @tmp)
    SELECT     q.[ID], q.nVal, SUM(p.nVal) AS Rem
     FROM         q INNER JOIN
                            q AS p ON q.[ID] >= p.[ID]
     GROUP BY q.[ID], q.nVal
     ORDER BY q.[ID]


რეზულტატი :
ქუოტა (Quote):
ID nVal Rem
-------------------- ----------- -----------
1 1 1
2 3 4
3 4 8
4 7 15
5 -7 8
6 -4 4
7 5 9
8 10 19
9 -9 10

(9 row(s) affected)

ID nVal Rem
----------- ----------- -----------
1 1 1
2 3 4
3 4 8
4 7 15
5 -7 8
6 -4 4
7 5 9
8 10 19
9 -9 10

(9 row(s) affected)
ქუოტა (Quote):
Sponsor  
 
Apex ltd. http://www.apex.ge
vajaGM Offline
#2 Posted : Wednesday, October 16, 2013 2:36:37 PM

Rank: Administration

Medals:

Groups: Administrators
Joined: 10/20/2012
Posts: 106
Points: 327
Location: Tbilisi

Thanks: 0 times
Was thanked: 0 time(s) in 0 post(s)
BB კოდი:
declare @t table (DYear int, V int, nVal money, rem money)
insert into @t (DYear,V,nVal)
select 2009,1,1.4
union all
select 2010,1,1.8
union all
select 2011,1,-1.13
union all
select 2012,1,1.18
union all
select 2013,1,2.2
union all
select 2009,2,1.12
union all
select 2010,2,1.1
union all
select 2011,2,1.05
union all
select 2012,2,1.03


;with n as (
   select DYear, V, nVal
         ,row_number() over(partition by V order by DYear asc) as rn
     from @t
), c as (
   select DYear, V, nVal, nVal as rem, rn
     from n
    where rn = 1
   union all
   select n.DYear, n.V, n.nVal, n.nVal + c.rem, n.rn
     from n
     join c on c.V  = n.V
           and c.rn = n.rn - 1
)
select DYear, V, nVal, rem, rn
  from c
order by V, DYear


;WITH q(DYear, V, nVal, rn) AS (SELECT     DYear, V, nVal,  ROW_NUMBER()OVER(partition by V ORDER BY DYear) AS rn
                                                            FROM         @t)
    SELECT     q.DYear, q.V, q.nVal, SUM(p.nVal) AS Rem, q.rn
     FROM         q INNER JOIN
                            q AS p ON q.V  = p.V and q.DYear >= p.DYear
     GROUP BY q.DYear, q.v, q.nVal, q.rn
     ORDER BY q.v, q.DYear



-- რეზულტატი:


ქუოტა (Quote):
DYear V nVal rem rn
----------- ----------- --------------------- --------------------- --------------------
2009 1 1,40 1,40 1
2010 1 1,80 3,20 2
2011 1 -1,13 2,07 3
2012 1 1,18 3,25 4
2013 1 2,20 5,45 5
2009 2 1,12 1,12 1
2010 2 1,10 2,22 2
2011 2 1,05 3,27 3
2012 2 1,03 4,30 4

(9 row(s) affected)

DYear V nVal Rem rn
----------- ----------- --------------------- --------------------- --------------------
2009 1 1,40 1,40 1
2010 1 1,80 3,20 2
2011 1 -1,13 2,07 3
2012 1 1,18 3,25 4
2013 1 2,20 5,45 5
2009 2 1,12 1,12 1
2010 2 1,10 2,22 2
2011 2 1,05 3,27 3
2012 2 1,03 4,30 4

(9 row(s) affected)
ქუოტა (Quote):
Users browsing this topic
Guest
ფავორიტებში დამატება
Forum Jump  
თქვენ არ შეგიძლიათ დაწეროთ ახალი თემა ამ ფორუმში.
თქვენ არ შეგიძლიათ გასცეთ პასუხი, თემას, ამ ფორუმში .
თქვენ არ შეგიძლიათ წაშალოთ თქვენი პოსტი ამ ფორუმში.
თქვენ არ შეგიძლიათ ჩაასწოროთ თქვენი პოსტი ამ ფორუმში.
თქვენ არ შეგიძლიათ შექმნათ გამოკითხვა ამ ფორუმში.
თქვენ არ შეგიძლიათ ხმის მიცემა ამ ფოუმში.

YAFVision Theme by Jaben Cargman (Tiny Gecko)
Powered by YAF | YAF © 2003-2009, Yet Another Forum.NET
This page was generated in 0.206 seconds.