[SQL / Access] 1 column omzetten in 2 ????

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Ik heb een tabel met daarin het field amount.

Nu wil ik graag een query maken die als output twee velden geeft: credit en debit.
Oftewel, ik wil een query doen dat alle negatieve waarden opgeteld worden in het debit veld en de positieve in het credit veld.

Ik weet wel hoe ik 1 van beide velden kan krijgen:

SELECT DISTINCTROW Sum(Amount) AS Bedrag
FROM Recharge WHERE Amount>0;

of:

SELECT DISTINCTROW Sum(Amount) AS Bedrag
FROM Recharge WHERE Amount<0;

Maar hoe kan ik nu beide queries combineren in 1????

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Volgens mij moet je met aliassen werken:
code:
1
2
3
4
SELECT DISTINCTROW Sum(a.Amount) AS debet,Sum(b.Amount) AS credit
FROM Recharge a, Recharge b
WHERE a.Amount>0 
AND   b.Amount < 0

NB: heb het zelf niet getest.

https://fgheysels.github.io/


  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Bedankt! Toch werkt het nog steeds niet.
Ik heb jouw query gebruikt, en krijg het volgende als resultaat:

Debit Credit
-61200719.9027181 54603907.9515892

Access heeft er echter wel een seconde of 20 voor nodig om te berekenen en bovendien klopt het resultaat voor geen meter. De werkelijke getallen zouden minstens een factor 1000 kleiner moeten zijn.

Daarna heb ik geprobeerd om alles afzonderlijk weer te geven met:

SELECT DISTINCTROW a.Amount AS Debit, b.Amount AS Credit
FROM Recharge AS a, Recharge AS b
WHERE (((a.Amount)<0) AND ((b.Amount)>0));

vervolgens krijg ik een resultaat terug met 5523980 records, terwijl de oorspronkelijke tabel slecht 8000 records bevat.

Ergens gaat er dus iets helemaal mis in mijn redenatie,
iemand die me nog een stapje verder op weg kan helpen ??

  • Boss
  • Registratie: September 1999
  • Laatst online: 15-09 14:11

Boss

+1 Overgewaardeerd

code:
1
SELECT iif(saldo>0;0;saldo) AS debet, iif(saldo>0;saldo;0) AS CREDIT FROM tabel;

of zoiets. Zo zou ik het doen. ff uit m'n hoofd, dus niet getets. Maar in ieder geval zou ik dus een IIf(statement;true;false) gebruiken. En dat voor alletwee de kolommen. Ik weet ook ff niet wat ook al weer credit/debet was.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Hmm, je krijgt een cartesiaans product terug. Dat is direct ook de aanleiding waarom die query zo lang duurt en waarom je zoveel records terug krijgt.
Uw query gaat nl. ieder record tabel van de a-tabel gaan linken met ieder record van de b-tabel.
Je moet dus zelf uw link nog specifieren. Je kunt eens proberen door a.ID = b.ID ofzo in uw WHERE clause toe te voegen.

https://fgheysels.github.io/


  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Als ik where a.id = b.id toevoeg, dan krijg ik geen enkel record meer terug als resultaat.
Wel voert hij de query weer heel snel uit :)

Het probleem is dat voor een bepaalde id een amount altijd of positief of negatief is, en dus nooit allebei. Vandaar dat ik dus geen resultaat hiermee krijg.

Ik zal het nog eens op de Boss manier proberen, maar andere suggesties zijn zeker welkom.

Verwijderd

Leuk dat iedereen hier zo uit zijn hoofd loopt te queryen. Vandaar dat ik ff mee wil doen:

Select "debet" as CD, sum([kolom]) as bedrag from [tabel] where kolom<0
UNION SELECT "credit" as CD, sum([kolom]) as bedrag from [tabel] where kolom>0


Laat jij even weten of het werkt?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:14
Op vrijdag 08 februari 2002 14:08 schreef Joshua30 het volgende:
Leuk dat iedereen hier zo uit zijn hoofd loopt te queryen. Vandaar dat ik ff mee wil doen:

Select "debet" as CD, sum([kolom]) as bedrag from [tabel] where kolom<0
UNION SELECT "credit" as CD, sum([kolom]) as bedrag from [tabel] where kolom>0


Laat jij even weten of het werkt?
Een UNION zou idd wel eens uitkomst kunnen bieden. Dat ik daar niet eerder aan gedacht heb.

https://fgheysels.github.io/


  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Thnx Joshua30!

Deze query geeft een goed resultaat!!!
Nu dan nog een vraag:

ik krijg nu een output:

CDbedrag
creditxxxxx
debetxxxxx

Nu wil ik graag een query maken die het volgende resultaat geeft:

Week Debit Credit
1 xxx xxx
2 xxx xxx
3 xxx xxx

Is er een manier om de query zo te verbouwen dat het in die vorm komt.

Ik heb al geprobeerd:

SELECT "debet" as CD, sum([reAmount]) as bedrag, DatePart("yyyy",[reDate],2) AS Jaar, DatePart("ww",[reDate],2) AS Week From [Recharge] where reAmount<0
GROUP BY DatePart("yyyy",[reDate],2), DatePart("ww",[reDate],2)
UNION SELECT "credit" as CD, sum([reAmount]) as bedrag, DatePart("yyyy",[reDate],2) AS Jaar, DatePart("ww",[reDate],2) AS Week From [Recharge] where reAmount>0
GROUP BY DatePart("yyyy",[reDate],2), DatePart("ww",[reDate],2);

Maar dan krijg ik

CD bedrag Jaar Week
credit xxx xxx xxx
credit xxx xxx xxx
...
debit xxx xxx xxx
debit xxx xxx xxx
....

Als ik alleen maar weet hoe ik die union select de rijen en kolommen kan omdraaien dan ben ik al een heel eind :)

Verwijderd

Dag naamgenoot...
De rijen en kolommen omzetten kun je doen door eerst de query uit te breiden met alle kolommen die je later in de rijen nodig hebt en vervolgens over deze query een crosstab-query heen te leggen. Gewoon de wizard gebruiken en een beetje trial-error klooien en dan moet je er wel uitkomen denk ik.

  • Digihelp ®
  • Registratie: Maart 2001
  • Laatst online: 25-08 10:10
Eerlijk gezegd had ik nog nooit van een crosstab query gehoord....maar het werkt nu.

voor geinteresseerden:

ik heb nu onderstaande query:

SELECT "debet" as CD, sum([reAmount]) as bedrag, DatePart("yyyy",[reDate],2) AS Jaar, DatePart("ww",[reDate],2) AS Week From [Recharge] where reAmount<0
GROUP BY DatePart("yyyy",[reDate],2), DatePart("ww",[reDate],2)
UNION SELECT "credit" as CD, sum([reAmount]) as bedrag, DatePart("yyyy",[reDate],2) AS Jaar, DatePart("ww",[reDate],2) AS Week From [Recharge] where reAmount>0
GROUP BY DatePart("yyyy",[reDate],2), DatePart("ww",[reDate],2);

en die heb ik gecrosstabt met de volgende query

TRANSFORM Avg([bedrag]) AS [The Value]
SELECT [Jaar], [Week]
FROM test
GROUP BY [Jaar], [Week]
PIVOT [CD];

en dan krijg ik precies het resultaat wat ik wilde !!!! :)

Verwijderd

/me leunt tevreden achterover en knikt... *D
Pagina: 1