webForumDet fria alternativet

Having och Alias problem

Databaser & SQL

2 svar · 398 visningar · startad av viggo

Medlem sedan dec. 20112 inlägg
Frågan#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

Medlem sedan aug. 20039 340 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.

Medlem 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

260 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)