webForumDet fria alternativet

Having och Alias problem

2 svar · 398 visningar · startad av viggo

viggoMedlem sedan dec. 20112 inlägg
#1

Hej alla, här är ett problem jag har med en MS SQL Query.

Jag vill att koden ska returnera utan NULL och 0 värden.
Men eftersom subqueryn är ett alias verkar det inte fungera?

Tacksam för svar.

SELECT   T.secid , 
	(SELECT sum(case 
		when type = 'Loan'
			then (shares * 1)
		when type = 'Returned loan'
			then (shares * -1) end) 
	FROM Transactions AS B
	WHERE porid = 'TURKEY' AND deleted = 0 AND T.secid = B.secid) AS 'NetLoans'

FROM Transactions AS T
group by secid
HAVING 'NetLoans' > '0'

Genererar lite censurerat...
SECID|NetLoans
xxxxx | NULL
xxxxx | 0.00
xxxxx | 92000.00

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Du ska inte sätta fältnamn inom enkelfnuttar. Du jämför den konstanta strängen ¨'NetLoans' med den konstanta strängen '0'. Du kan även plocka bort fnuttarna runt nollan, även om du inte måste.

Sen vet jag inte varför du skulle behöva en subquery för detta, om frågan itne innehåller mer saker som du har tagit bort. Beroende på hur mycket MS SQL optimerar sökningen är det dessutom eventuellt dåligt prestandamässigt. För varje rad i hela tabellen utförs underfrågan, och sorteringen sker först efteråt.

SELECT   T.secid , 
	sum(case 
		when type = 'Loan'
			then (shares * 1)
		when type = 'Returned loan'
			then (shares * -1) end) AS NetLoans
WHERE porid = 'TURKEY' AND deleted = 0
FROM Transactions AS T
GROUP BY secid
HAVING NetLoans > 0

Dessutom är det min personliga åsikt att du borde lagra återbetalningarna som ett negativt nummer i databasen. Det skulle förenkla denna kod. Då skulle du helt enkelt kunna köra sum(shares) utan case-satsen.

Edit: Ett group för mycket.

viggoMedlem sedan dec. 20112 inlägg
#3

Hej tack för snabbt svar.

Det är lyckligtvis inte jag som byggt databasen, det är ett hastjobb som skulle behöva ses över.

Precis som du säger så är alla transaktioner positiva även om det är returer...
Därav case lösningen.

det jag vill ha ut är en summering av alla transaktionerna per unikt secid fram till ett visst datum (datum lägger jag in sist i where tänkte jag).

Jag tror jag testade att skriva sådär först, men fick ett fel att den inte kunde gruppera på secid pga aggregated functions ...

Ska testa och utvärdera imorgon på jobbet. :bire

129 ms totalt · 3 externa anrop · v20260731065814-full.a4c710cd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)