Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-09-29 12:25:40 - Stefan Sunnerheim, i forum sql-server/msde, Tråden har 16 Kommentarer och lästs av 1160 personer

Hej!

Har 2 tabeller som enkelt uttryckt ser ut så här:

Tabell1
--------
Id *
Butik

Tabell2
---------
Id *
Value (Decimal, Innehåller både positvia & negativa tal)

Jag vill summera Value grupperat per butik, men jag vill ha en positv och en negativ summa.
Alltså Positiva summan=Summan av alla positiva Value
Negativa summan = Summan av alla negativa value

Så här ser min sql ut nu för att få ut negativa summan:
select Butik, Sum(Value) Summa from Tabell2
inner join Tabell1 on Tabell1.Id=Tabell2.Id
where Value < 0
group by Butik
order by Butik

... och så positva summan:
select Butik, Sum(Value) Summa from Tabell2
inner join Tabell1 on Tabell1.Id=Tabell2.Id
where Value > 0
group by Butik
order by Butik

Svaret blir ju typ för den sistnämda frågan:
Butik | Summa
1 | 92019
2 | 8989
3 | 9009909

Skulle vilja slå ihop dessa frågor o få svar typ så här:

Butik | Postiv | Summa
1 | 1 | 92019
1 | 0 | -834894
2 | 1 | 8989
2 | 0 | -79938


Är detta möjligt?

Vänliga Hälsningar
/ Stefan


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-09-29 13:03:46 - Niklas Jansson

ngt i stil med
(SELECT ..., 0 as Type WHERE value < 0) UNION (SELECT ..., 1 as Type WHERE value > 0)


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-09-29 13:32:02 - Jan Bulér

SELECT TOP (100) PERCENT dbo.Table_1.Butik, SUM(dbo.Table_2.Value) AS Summa
FROM dbo.Table_1 INNER JOIN
dbo.Table_2 ON dbo.Table_1.Id = dbo.Table_2.Id
GROUP BY dbo.Table_1.Butik, SIGN(dbo.Table_2.Value)
HAVING (SIGN(dbo.Table_2.Value) <> 0)
ORDER BY dbo.Table_1.Butik


Raden "HAVING (SIGN(dbo.Table_2.Value) <> 0)" har jag med för att inte få med 0-värden som en grupp.


[Edit]

Här är ett annat sätt för att få ut samma uppgifter fast med PIVOT funktion

SELECT pvt.[Butik], pvt.[-1], pvt.[1]
FROM (SELECT t1.[Butik], t2.[Value], SIGN(t2.[Value]) AS [Tecken]
FROM [dbo].[Table_1] t1 INNER JOIN
[dbo].[Table_2] t2 ON t1.[Id] = t2.[Id]) AS t2 PIVOT (SUM([Value]) FOR [Tecken] IN ([-1], [1])) AS pvt;


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-09-29 22:22:34 - Johan Djupmarker

Har inte testat, men det skulle kunna fungera såhär, men är långt ifrån säker :)

select Butik, Value < 0 AS Negativ, Sum(Value) Summa from Tabell2
inner join Tabell1 on Tabell1.Id=Tabell2.Id
where Value < 0
group by Butik, Value < 0
order by Butik

/Johan


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-06 14:36:53 - Stefan Sunnerheim

Tack för svaren.
Har testat lite nu och fått det att fungera. Vilken av era frågor anser ni vara snabbast. Tabellerna innehåller väldigt många rader = > 1000000.


Svara

Sv:Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-06 14:55:17 - Niklas Jansson

Det är väl bara att testa. Spontant tror jag faktiskt en del på min; borde gå på O(N) (N för att hitta första, N för att hitta andra, N för att slå ihop), ngt i stil med O(3N)?

Kör man en join borde det väl gå på O(N^2) (N per varje rad)?
Fast det är klart, databaser är ju rätt hårt optimerade...

Edit: O(NlogN) enligt http://www.partow.net/programming/databasealgos/index.html


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-06 21:29:03 - Andreas Hillqvist

I access kan man skriva:

SELECT Table1.Butik, -Sum(Table2.Value * (Table2.Value>0)) AS Posetive, -Sum(Table2.Value  * (Table2.Value<0)) AS Negative
FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.Id
GROUP BY Table1.Butik;


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 11:11:08 - Stefan Sunnerheim

Tack för svaret Niklas.
Jag måste väl ändå köra en join eftersom jag ska ha Butik från tabell1, eller hur tänkte du?


Svara

Sv:Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 13:44:38 - Niklas Jansson

Jo, jo, men det är ju något man lägger på i efterhand. Påverkar inte argumentet.


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 20:31:38 - Stefan Sunnerheim

Hmm förstår inte riktigt hur du menar. Såhär skriver jag nu enligt ditt "union" förslag. Är det så du menar?

SELECT Table_1.Butik, 0 as Type, SUM(Table_2.Value) AS Summa,
FROM Table_1 INNER JOIN
Table_2 ON Table_1.Id = Table_2.Id
WHERE Table_2.Value < 0
GROUP BY dbo.Table_1.Butik, Type
UNION
SELECT Table_1.Butik, 1 as Type, SUM(Table_2.Value) AS Summa,
FROM Table_1 INNER JOIN
Table_2 ON Table_1.Id = Table_2.Id
WHERE Table_2.Value > 0
GROUP BY dbo.Table_1.Butik, Type
ORDER BY dbo.Table_1.Butik


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 20:43:51 - Håkan Borneland

Hej!

Om du inte måste ha två rader per butik är följande ett annat sätt att lösa det på.
(endast en rad per butik):

Butik | Positiv summa | Negativ summa
1 | 92019 | -834894
2 | 8989 | -79938

SELECT a.Butik,
"Positiv summa"  = SUM(CASE WHEN b.value > 0 THEN b.value ELSE 0 END),
"Negativ summa" = SUM(CASE WHEN b.value < 0 THEN b.value ELSE 0 END)
FROM Tabell1 a
INNER JOIN Tabell1 b ON a.Id = b.Id
GROUP BY b.Butik


Saknas det positiva eller negativa tal för en butik blir det 0.


//Håkan


Svara

Sv:Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 21:06:11 - Niklas Jansson

Stefan: Jag antog att du menade prestandan. Jag menar att joinen inte påverkar prestandan.

I princip är det du ska göra något i stil med

(SELECT ... UNION SELECT ...) JOIN SELECT ...

Alltså, slå ihop deltabellerna först, sen kan du joina dem med vad du vill.
Försök att få bara den satsen att funka först.

Håkan: Är CASE del av SQL-standarden?
Det tycker jag alltid är en viktig del av frågeställningen. Är prestandavinsten så stor att den öveväger nyttan med att kunna använda koden med en annan databas?

EDIT: Det var inget, vid närmare eftertanke är det väl faktiskt så att den är del av standarden. I så fall en mycket trevlig variant.


Svara

Sv: Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 21:40:06 - Håkan Borneland

Niklas: Eftersom du ändå frågade (och svarade själv), ja det är det.

//Håkan


Svara

Sv:Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 23:15:02 - Andreas Hillqvist

Om du använder SQL server varför inte göra vyer? Det borde ge en effektiv fråga?

Vy för positiva tal:

CREATE VIEW viewPositivTabell AS
SELECT Table_2.Id, 1 as Type, SUM(Table_2.Value) AS PositivSumma
FROM Table_2
WHERE Table_2.Value > 0
GROUP BY Table_2.Id

Och för negativa tal:
CREATE VIEW viewNegativTabell AS
SELECT Table_2.Id, 0 as Type, SUM(Table_2.Value) AS NegativSumma
FROM Table_2
WHERE Table_2.Value < 0
GROUP BY Table_2.Id

Ger frågan:
SELECT     Table_1.Butik, PositivSumma, NegativSumma
FROM         Table_1 LEFT JOIN
    viewPositivTabell ON Table_1.Id = viewPositivTabell.Id  LEFT JOIN
    viewNegativTabell ON Table_1.Id = viewNegativTabell.Id


Eller om du vill skippa de två första vyerna och göra en fråga:
SELECT     Table_1.Butik, PositivSumma, NegativSumma
FROM         Table_1 LEFT JOIN
    (SELECT Table_2.Id, SUM(Table_2.Value) AS PositivSumma
        FROM Table_2
        WHERE Table_2.Value > 0
        GROUP BY Table_2.Id) AS PositivTabell ON Table_1.Id = PositivTabell.Id  LEFT JOIN
    (SELECT Table_2.Id, SUM(Table_2.Value) AS NegativSumma
        FROM Table_2
        WHERE Table_2.Value < 0
        GROUP BY Table_2.Id) AS NegativTabell ON Table_1.Id = PositivTabell.Id



Svara

Sv:Group by med Sum, Skilja på positva & negativa värden?

Postades av 2006-10-12 23:19:35 - Niklas Jansson

Jävla märkligt att jag aldrig använder den... Finns ju massa puckade konstruktioner i applikationer jag har skrivit med massa efterbehandling av data, när man kan lösa det så pass enkelt...


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 617
27 953
271 709
5 742
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies