"Jesper Frank Nemholt" <jfn@dassic.com> skrev i en meddelelse
news:41c5a6bc$0$74686$14726298@news.sunsite.dk...
> Hej!
>
Hej Jesper
> Jeg har 2 queries :
>
> SELECT count(SER_1.SER_ID), WOG_1.WOG_SEARCHCODE FROM ITSM_SERVICECALLS
> SER_1, ITSM_WORKGROUPS WOG_1 WHERE SER_1.SER_ASS_WOG_OID = WOG_1.WOG_OID
> AND WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%' GROUP BY
> WOG_1.WOG_SEARCHCODE ORDER BY count(SER_1.SER_ID)
>
> SELECT count(INC_1.INC_ID), WOG_1.WOG_SEARCHCODE FROM ITSM_INCIDENTS
> INC_1, ITSM_WORKGROUPS WOG_1 WHERE INC_1.INC_ASSIGN_WORKGROUP =
> WOG_1.WOG_OID AND WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%' GROUP BY
> WOG_1.WOG_SEARCHCODE ORDER BY count(INC_1.INC_ID)
>
Jeg tillader mig lige at omskrive dine queries til inner joins og formatere
dem lidt (jeg har nemlig lidt svært ved at overskue dem, sådan som du har
lavet dem - min fejl!):
SELECT count(SER_1.SER_ID), WOG_1.WOG_SEARCHCODE
FROM ITSM_SERVICECALLS SER_1
INNER JOIN ITSM_WORKGROUPS WOG_1
ON SER_1.SER_ASS_WOG_OID = WOG_1.WOG_OID
WHERE WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%'
GROUP BY WOG_1.WOG_SEARCHCODE
ORDER BY count(SER_1.SER_ID)
SELECT count(INC_1.INC_ID), WOG_1.WOG_SEARCHCODE
FROM ITSM_INCIDENTS INC_1
INNER JOIN ITSM_WORKGROUPS WOG_1
ON INC_1.INC_ASSIGN_WORKGROUP = WOG_1.WOG_OID
WHERE WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%'
GROUP BY WOG_1.WOG_SEARCHCODE
ORDER BY count(INC_1.INC_ID)
> Den foerste finder kald per arbejdsgruppe i en Oracle database der
> fungerer som backend til HP Service Desk. Disse sorteres efter antal.
>
> Den anden goer det samme, men med alarmer.
>
> Jeg vil gerne have disse 2 vaerdier (count(kald), count(alarmer),
> arbejdsgruppe) samlet i een query saa jeg derefter nemt kan bruge data som
> input til et akkumuleret soejlediagram der opdeler soejlerne i hhv. kald
> og alarmer, men samtidig totalt summerer de 2.
>
> Det skal siges at ikke alle arbejdsgrupper har kald og ikke alle har
> alarmer, saa der skal laves outer join formoder jeg, men mit foerste gaet
> ser ikke ud til at vaere rigtigt (Oracle taenker ihvertfald meget laenge
> over det mens de 2 individuelle queries terminerer paa et sekund) :
>
> SELECT count(SER_1.SER_ID), count(INC_1.INC_ID), WOG_1.WOG_SEARCHCODE FROM
> ITSM_SERVICECALLS SER_1, ITSM_INCIDENTS INC_1, ITSM_WORKGROUPS WOG_1 WHERE
> SER_1.SER_ASS_WOG_OID = INC_1.INC_ASSIGN_WORKGROUP (+) AND
> SER_1.SER_ASS_WOG_OID = WOG_1.WOG_OID AND WOG_1.WOG_SEARCHCODE LIKE
> 'DCSEMOPS-TS-%' GROUP BY WOG_1.WOG_SEARCHCODE ORDER BY count(SER_1.SER_ID)
>
Den omskriver jeg lige igen...
SELECT count(SER_1.SER_ID), count(INC_1.INC_ID), WOG_1.WOG_SEARCHCODE
FROM ITSM_SERVICECALLS SER_1
INNER JOIN ITSM_INCIDENTS INC_1
ON SER_1.SER_ASS_WOG_OID = INC_1.INC_ASSIGN_WORKGROUP
INNER JOIN ITSM_WORKGROUPS WOG_1
ON SER_1.SER_ASS_WOG_OID = WOG_1.WOG_OID
WHERE WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%'
GROUP BY WOG_1.WOG_SEARCHCODE
ORDER BY count(SER_1.SER_ID)
> Jeg formoder at jeg har lavet en eller anden elementaer fejl....men da jeg
> ikke er SQL noerd kan jeg ikke lige finde den....saa hjaelp er velkommen.
OK, jeg vil forsøge
Jeg kender ikke noget til Oracle, men mon ikke den kan det samme som DB2?
Så ville jeg gøre det nogenlunde sådan her:
WITH OPA AS
(
SELECT COUNT(SER_ID) AS OPKALD, SER_ASS_WOG_OID
FROM ITSM_SERVICECALLS
GROUP BY SER_ASS_WOG_OID
),
APA AS
(
SELECT COUNT(INC_ID) AS ALARMER, INC_ASSIGN_WORKGROUP
FROM ITSM_INCIDENTS
GROUP BY INC_ASSIGN_WORKGROUP
)
SELECT WOG1.WOG_SEARCHCODE,
SUM(COALESCE(OPA.OPKALD, 0)) AS OPKALD,
SUM(COALESCE(APA.ALARMER, 0)) AS ALARMER
FROM ITSM_WORKGROUPS WOG_1
LEFT JOIN OPA
ON WOG_1.WOG_OID = OPA.SER_ASS_WOG_OID
LEFT JOIN APA
ON WOG_1.WOG_OID = APA.INC_ASSIGN_WORKGROUP
WHERE WOG_1.WOG_SEARCHCODE LIKE 'DCSEMOPS-TS-%'
GROUP BY WOG_1.WOG_SEARCHCODE
HAVING SUM(COALESCE(OPA.OPKALD, 0)) > 0 OR SUM(COALESCE(APA.ALARMER, 0)) > 0
ORDER BY SUM(COALESCE(OPA.OPKALD, 0))
Som du kan se, så har jeg brugt en WITH clause til at redefinere dine to
oprindelige querier til to delquerier uden join, men med ren gruppering på
arbejdsgruppe. Det er først under sammenknytningen til sidst, at jeg joiner
og selekterer. COALESCE funktionen erstatter et evt null med værdien 0,
hvilket gør at SUM funktionen ikke kløjs i det hvis der f.eks ikke har været
nogen alarmer, men . Nogle bruger funktionen IFNULL i stedet (det er det
samme).
Til sidst vil jeg bare komme med en lille disclaimer: Det er ikke testet,
men bare noget "klyt", som er smidt hurtigt sammen, så det ville undre mig,
om det kørte straks fra starten. Men det burde give dig en indgangsvinkel
til hvordan det kan gøres...
>
> /Jesper
/Kaj