Avatar billede hansjacob Nybegynder
04. november 2002 - 15:19 Der er 5 kommentarer og
1 løsning

Opdeling i to variable efter kriterie

Hej

Jeg har en bunke data, som jeg gerne vil opdele after dato. Altså noget frem til en dato og resten herefter.

Mine data kunne se således ud:

onlinetime    date      ip
1              21-09-01  21121
.5            10-09-01  212228
.7            21-10-01  298903
2              01-05-01  278523

Jeg vil så gerne gruppere mine data efter en bestemt ip adresse, men samtidig skelne mellem hvad der eksempelvis er før den 10-09-01. Og så i øvrigt summere op. Den er lidt svær, det ved jeg godt. Især fordi jeg gerne vil have dem før datoen i én variabel og dem efter i en anden!

SELECT
  SUM(onlinetime) AS sumTime
GROUP BY
  ip

Men hvordan får jeg så lavet en where eller andet således, at jeg kan få en variabel sumTimeBefore og sumTimeAfter, hvor de så hver især indeholder før og efter en given dato.
Avatar billede kennie_nm Nybegynder
04. november 2002 - 20:54 #1
så vidt jeg kan se, bliver du nødt til at lave to forespørgsler (med mindre MySQL er begyndt at supportere nestede selects) -

SELECT
SUM(onlinetime) AS sumTime
where date < 10-09-01
GROUP BY
ip

og en tilsvarende med date >= 10-09-01

Hvis MySQL ikke understøtter ordning af datoer, så kunne du sikker bruge passende  unix_time_stamp konverteringer
Avatar billede proaccess Nybegynder
08. november 2002 - 14:26 #2
SELECT ip, SUM(IF(date<10-09-01,onlinetime,0)) onbefore, SUM(IF(date<10-09-01,0,onlinetime)) onafter FROM xxx GROUP BY ip;

Igen skal du være sikker på formateringen/sammenligningen af dato'er...
MEN løsningen på før/efter problematikken er IF!
Avatar billede hansjacob Nybegynder
12. november 2002 - 07:58 #3
Undskyld den sene svartid.

Jeg kan ikke finde noget om onbefore i mysql dokumentationen.

Jeg tænkte, om det var muligt at mase to forespørgsler sammen? Og derefter sortere dem?

noget i stil med

MERGE_ELLER_HVAD_DEN_MON_HEDDER(
  SELECT
  SUM(onlinetime) AS sumTime
  where date < 10-09-01
  GROUP BY
  ip
,
  SELECT
  SUM(onlinetime) AS sumTime
  where date > 10-09-01
  GROUP BY
  ip
)
order by noget_andet

Kunne det være en mulighed?
Avatar billede hansjacob Nybegynder
12. november 2002 - 08:09 #4
aha! Hvad med UNION???
Avatar billede proaccess Nybegynder
12. november 2002 - 08:17 #5
onbefore og onafter var bare mine forslag til kolonnetitler...

jeg forventede at du ville have en opstilling a'la:
ip  sumFør10/9  sumEfter10/9
xxx    10:23        22:14
yyy    11:43        13:23

Hvis du kan "klare dig" med en opremsning, så du får:
ip  periode  sumTime
xxx  Før10/9    10:23
xxx  Efter10/9  22:14
yyy  Før10/9    11:43
yyy  Efter10/9  13:23

Så kan du bruge:
SELECT ip, 'Før10/9' AS periode, SUM(onlinetime) AS sumTime
FROM tabelNavn
WHERE date < 10-09-01
GROUP BY ip, periode
UNION SELECT ip, 'Efter10/9' AS periode, SUM(onlinetime) AS sumTime
FROM tabelNavn
WHERE date >= 10-09-01
GROUP BY ip, periode;
Avatar billede hansjacob Nybegynder
12. november 2002 - 13:41 #6
Sorry, jeg troede det var en indbygget funktion. Ikke sådan, når man bruger sådan noget fancy udenlandsk....

Tusind tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester