Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2016-11-30, 08:51
  #13
Medlem
dengo.dajordens avatar
Har följande kod som kodsnickrarn föreslog med minimala ändringar som jag gjort. Funkar fint:


where delen 'WHERE REQUIRED.REQ_TOTAL >= 18000' säkrar att jag endast får in grupper vars totalsumma överstiger eller är lika med 18000 transaktioner.

Jag vill gärna lägga till ett villkor så jag bara får grupper som (förutom where delen ovan) också innehåller minst 3 records.

Jag illustrerar:

(1) Stockholm 03Mar16 5000
(2) Stockholm 04Mar16 13000

(3) Kiruna 03Mar16 7000
(4) Kiruna 04Mar16 5000
(5) Kiruna 05Mar16 6000

Stockholmgruppen exkluderas (den uppfyller bara kravet 'REQUIRED.REQ_TOTAL >= 18000' men inte minst 3 records) medan Kirunagruppen inkluderas då den uppfyller båda kraven.
Citera
2016-11-30, 11:15
  #14
Moderator
Siegfrids avatar
Citat:
Ursprungligen postat av dengo.dajorden
Har följande kod som kodsnickrarn föreslog med minimala ändringar som jag gjort. Funkar fint:


where delen 'WHERE REQUIRED.REQ_TOTAL >= 18000' säkrar att jag endast får in grupper vars totalsumma överstiger eller är lika med 18000 transaktioner.

Jag vill gärna lägga till ett villkor så jag bara får grupper som (förutom where delen ovan) också innehåller minst 3 records.

Jag illustrerar:

(1) Stockholm 03Mar16 5000
(2) Stockholm 04Mar16 13000

(3) Kiruna 03Mar16 7000
(4) Kiruna 04Mar16 5000
(5) Kiruna 05Mar16 6000

Stockholmgruppen exkluderas (den uppfyller bara kravet 'REQUIRED.REQ_TOTAL >= 18000' men inte minst 3 records) medan Kirunagruppen inkluderas då den uppfyller båda kraven.

count(*) > 2?
Citera
2016-11-30, 12:48
  #15
Medlem
dengo.dajordens avatar
Kan du precisera lite?
Citera
2016-11-30, 19:47
  #16
Medlem
John-Pauls avatar
Nått stil med en sub qurey
Kod:
...
and 2 < ( select count(*)
from...+ ev. join upp i yttre är möjligt vid behov
where... 
etc.)
...
__________________
Senast redigerad av John-Paul 2016-11-30 kl. 19:55.
Citera
2017-03-23, 11:11
  #17
Medlem
dengo.dajordens avatar
Utnyttjar äggsperternas kunskap igen med denna statement som fungerar fint men som jag vill utöka:


Jag får fint mina offices med sin total summa transaktioner per office i sista kolonnen.

OFFICE_ID TRANSACTION_DATE TRANSACTION_CNT TOTAL_SUMMA

(1) Stockholm 03Mar16 5000 24000
(2) Stockholm 04Mar16 6000 24000
(3) Stockholm 05Mar16 7000 24000
(4) Stockholm 06Mar16 3000 24000
(5) Stockholm 07Mar16 3000 24000

(6) Kiruna 03Mar16 4000 22000
(7) Kiruna 04Mar16 5000 22000
(8) Kiruna 05Mar16 6000 22000
(9) Kiruna 07Mar16 7000 22000

Jag skulle vilja få returnerat det antalet dagar som officen har data på. Om jag räknar max(date)-min(date) ger Stockholm 5 dagar och Kiruna 5 dagar det är inte det jag vill ha.

Jag vill utelämna de dagar som inte har data, så att Stockholm returnerar 5 dagar och Kiruna 4 dagar. Kan man bygga in det på ett enkelt sätt?
Citera
2017-04-02, 07:50
  #18
Moderator
Protons avatar
Citat:
Ursprungligen postat av dengo.dajorden
Utnyttjar äggsperternas kunskap igen med denna statement som fungerar fint men som jag vill utöka:


Jag får fint mina offices med sin total summa transaktioner per office i sista kolonnen.

OFFICE_ID TRANSACTION_DATE TRANSACTION_CNT TOTAL_SUMMA

(1) Stockholm 03Mar16 5000 24000
(2) Stockholm 04Mar16 6000 24000
(3) Stockholm 05Mar16 7000 24000
(4) Stockholm 06Mar16 3000 24000
(5) Stockholm 07Mar16 3000 24000

(6) Kiruna 03Mar16 4000 22000
(7) Kiruna 04Mar16 5000 22000
(8) Kiruna 05Mar16 6000 22000
(9) Kiruna 07Mar16 7000 22000

Jag skulle vilja få returnerat det antalet dagar som officen har data på. Om jag räknar max(date)-min(date) ger Stockholm 5 dagar och Kiruna 5 dagar det är inte det jag vill ha.

Jag vill utelämna de dagar som inte har data, så att Stockholm returnerar 5 dagar och Kiruna 4 dagar. Kan man bygga in det på ett enkelt sätt?
Enkelt och enkelt, men det jag ser framför mig är att du joinar på ett subset på din huvudfråga.

Lite pseudokod:

Kod:
SELECT officeid, [annat tjafs], ISNULL(sub.antaldagar,0) As Datadagar FROM WHEREVER
LEFT OUTER JOIN
(
SELECT officeIdCOUNT(numDays)
FROM sometable where sometable.data IS NOT NULL
GROUP BY officeid
) AS sub ON sub.officeId WHEREVER.officeid 
Där är prinhcipen, nu är det bara att hacka loss.
Citera
2017-05-31, 15:43
  #19
Medlem
dengo.dajordens avatar
Jag har följande sql statement som fungerar fint och returnerar de offices vars summa transaktioner för hela perioden överstiger en viss siffra.


Jag gör ett nytt försök då jag inte har lyckats med protons förslag (säger inte att det inte fungerar).

Jag vill endast ha i retur de grupper som överstiger en viss siffra och som inte saknar dagar i perioden. En missing record i db indikerar att det inte varit några transaktioner den dagen.

(1) Stockholm 05May17 5000
(2) Stockholm 06May17 6000
(3) Stockholm 07May17 7000
(4) Stockholm 08May17 6000

(5) Kiruna 05May17 5000
(6) Kiruna 06May17 6000
(7) Kiruna 08May17 14000

(8) Falun 05May17 14000
(9) Falun 06May17 10000
(10) Falun 07May17 11000
(11) Falun 08May17 12000

jag tänker mig ett villkor i where-delen i stilen med denna pseudokod:

WHERE '08-May-2017' MINUS '05-May-2017' + 1 MINUS returned_records_for_this_group = 0

dvs antalet dagar i perioden är lika med antalet returnerade records för gruppen för perioden.

Stockholmsgruppen skulle inte returneras, uppfyller antalet dagar men inte summan.
Kirunagruppen skulle inte returneras, uppfyller summan men inte antalet dagar.
Falungruppen skulle returneras, uppfyller både antalet dagar och summan.

Vad säger experterna?
__________________
Senast redigerad av dengo.dajorden 2017-05-31 kl. 15:46.
Citera
2017-05-31, 22:58
  #20
Medlem
John-Pauls avatar
Jag har inte läst tråden utan endast sista posten och enligt den så blev här, jag kan alltså ha haft alldeles för bråttom.

Citera
2017-05-31, 23:43
  #21
Medlem
dengo.dajordens avatar
Tack, ska laborera med din 'having' få se om det funkar.

Min nuvarande statement returnerar gruppen as is (dvs alla records) då jag presenterar de i chart så en summa räcker inte.

I min sql statement när jag inkluderar count(pushstat_date) får jag alla my_office_id som är aggregerade under varje pushstat_date, tar jag istället count(distinct pushstat_date) får jag = 1 som bara visar att count(pushstat_date) bara räknar ett antal av samma pushstat_date.

Jag vill lägga till ett villkor till min nuvarande statement så att urvalet begränsas ytterligare, bara grupper med minst X antal records tas med.
Citera
2017-06-01, 21:12
  #22
Medlem
John-Pauls avatar
Ja, "bara grupper med" låter som att "having" filtrerar ditt grupperade resultat och att det är vad du är ute efter.
Citera
2017-06-09, 12:17
  #23
Medlem
dengo.dajordens avatar
OK, jag har möblerat om i min sql statement.


Den returnerar dock FLERA datum records (med samma datum) för en viss office medan jag skulle vilja ha alla transaktioner för samma datum samma office aggregerade/summerade till en enda record.

Jag fattar att det ska vara en 'group by' men jag får diverse ORA-errors både när jag gör 'group by' i den inre statement eller i den yttre.

Hoppas äggsperterna har tips. Det uppskattas.
Citera
2017-06-10, 13:11
  #24
Medlem
John-Pauls avatar
Jag är ingen äggspert men du kanske ska fundera på att börja om från scratch med den där sql satsen för den ser spontant överdrivet komplicerad ut.
Ska du "aggregera en aggregering" så kan en lösning vara att för ta fram ett aggregerat resultat i en temporär tabell och sedan aggergera, och/eller filtrera det, men det låter inte som att din uppgift är detta utan att det är att ett villkor/filter ska appliceras på ett aggregerade resultatet vilket kan lösas med "having ...."
Reservation för att jag läser frågeställningen felaktigt.
__________________
Senast redigerad av John-Paul 2017-06-10 kl. 13:25.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback