[T-SQL] Alle records die samen tenminste x vormen, kan dat?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
Stel:

De volgende tabel

code:
1
2
3
4
5
6
7
id amount
01 100
02 200
03 300
04 200
05 100
06 300


Is er een manier om, georderd by id, net zolang records te selecteren tot de som gelijk is aan waarde x?

Dus:

SQL:
1
2
SELECT id FROM tabel
HAVING SUM(amount) > 400


(Bovenstaande kan natuurlijk niet ;) )

zou moeten resulteren in 01,02,03.

100+200 = < 400, 100+200+300 is wel genoeg. Kan dit?

[ Voor 7% gewijzigd door Wijnbo op 19-04-2010 14:43 ]


Acties:
  • 0 Henk 'm!

  • jurma
  • Registratie: December 2003
  • Laatst online: 11-09 23:36

jurma

simply connecting...

Je zou dan moeten gaan werken met subquery's of stored procedures om het netjes voor elkaar te krijgen.

If you want to be serious, we make a powerpoint presentation.


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Volgens mij is dit een van de dingen waarvoor een cursor wél een goede oplossing zou zijn.

Zie: http://msdn.microsoft.com/en-us/library/ms181441.aspx

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het lijkt me eigenlijk een stuk handiger om dit in code op te lossen. Simpelweg door de recordset lopen geordend op id, en stoppen als je genoeg hebt. :p Kan wel trouwens, iets als:
SQL:
1
2
select t1.id from tabel t1 left join tabel t2 on t2.id<t1.id group by t1.id 
    having sum(t2.amount)<400

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
Ik zit nu iets te knutselen met een tijdelijke tabel, maar lijkt me ook niet echt de way to go... Ik ga eens naar een cursor kijken :)

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
Voor diegene die het wil:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT  Temp.id ,
        Temp.amount ,
        Temp.[amount_total_running]
FROM    ( SELECT    A.id ,
                    A.amount ,
                    COALESCE(SUM(B.amount), 0)
          FROM      Table_1 AS A
                    LEFT OUTER JOIN Table_1 AS B ON A.id >= B.id
          GROUP BY  A.id ,
                    A.amount
        ) AS Temp ( id, amount, [amount_total_running] )
WHERE   Temp.[amount_total_running] < 800
        OR Temp.id IN (
        SELECT TOP ( 1 )
                Temp2.id
        FROM    ( SELECT    C.id ,
                            C.amount ,
                            COALESCE(SUM(D.amount), 0)
                  FROM      Table_1 AS C
                            LEFT OUTER JOIN Table_1 AS D ON C.id >= D.id
                  GROUP BY  C.id ,
                            C.amount
                ) AS Temp2 ( id, amount, [amount_total_running] )
        WHERE   Temp2.[amount_total_running] > 800
        ORDER BY Temp2.id )
ORDER BY Temp.id 


Doet wat ik wil. Iets zegt me dat ik toch beter iets met cursors kan gaan zoeken...

Die IN+subselect is puur om het volgende record ook te zoeken, aangezien ik alles wou hebben wat TEN MINSTE gelijk was aan x. Dus eerst alles selecteren wat samen kleiner is, dan de eerst volgende er bij die er buiten valt 8)

[ Voor 10% gewijzigd door Wijnbo op 19-04-2010 15:21 ]

Pagina: 1