Sum und group by - was mache ich falsch?

K

Kalli

Guest
Hallo zusammen,

erstmal vorab:
Ich bin in Sachen SQl absoluter Anfänger und hab mir mein Wissen nach und nach selber beigebracht.

Nun habe ich das problem, dass ich eine Abfrage aus 2 verschiedene Datenbanktabellen kombinieren möchte, wobei bei der Abfrage aus einer Tabelle eine Sum-Funktion vorhanden ist.
Wie ich erfahren habe, muss ich deshlab bei der anderen Abgarge automatisch gruppieren, sonst funktioniert das wohl nicht.

Genau da liegt mein Problem. Ich habe die Abfrage nun wiefolgt zusammen gebastelt:

SELECT
pj_name,
cast(pj_nr as nvarchar(12)) as pj_nr,
OIC_User.GetUserExchangeName(PORTFOLIO_LEITER) as
PORTFOLIO_LEITER,
OIC_User.GetUserExchangeName(PJ_LEITER) as PJ_LEITER,
OIC_User.GetUserExchangeName(TEAM_CONTROLLING) as
TEAM_CONTROLLING,
STATUS,
PROJEKT_TYP,
SUM(di1+di2+di3+di4+di5) as SUMME_RATIO,
MS0_DATUM_PLAN,
MS0_DATUM_IST,
case when MS1_DATUM_FC is not null then MS1_DATUM_FC
else MS1_DATUM_PLAN end as MS1,
MS1_DATUM_IST,
case when MS2_DATUM_FC is not null then MS2_DATUM_FC
else MS2_DATUM_PLAN end as MS2,
MS2_DATUM_IST,
case when MS3_DATUM_FC is not null then MS3_DATUM_FC
else MS3_DATUM_PLAN end as MS3,
MS3_DATUM_IST,
case when MS4_DATUM_FC is not null then MS4_DATUM_FC
else MS4_DATUM_PLAN end as MS4,
MS4_DATUM_IST,
case when MS5_DATUM_FC is not null then MS5_DATUM_FC
else MS5_DATUM_PLAN end as MS5,
MS5_DATUM_IST
FROM t_oic_prodat, t_oic_prodat_ratio_ist
WHERE
projekt_typ = 'RS' or projekt_typ = 'RM' or projekt_typ = 'RT' or projekt_typ = 'RA'
and (status is null or status in ('','läuft'))
and t_oic_prodat_ratio_ist.Quartal =
'Q ' +
case when month(getdate()) between 1 and 3 then 'I'
when month(getdate()) between 4 and 6 then 'II'
when month(getdate()) between 7 and 9 then 'III'
when month(getdate()) between 10 and 12 then 'IV'
end
+ ' ' + year(getdate())
GROUP BY pj_name, pj_nr, pj_leiter, Team_controlling, status, projekttyp, ms0_datum_plan, ms0_datum_ist
ORDER BY projekt_typ


Lasst euch nicht von den einzelen Feldabfragen und Where/Case-Klauseln stören, die sind soweit korrekt.
Es geht mir darum, wie ich die Abfrage umformen muss, damit ich die Sum-Funktion nutzen kann.
Mit der aktuellen Abfrage bekomme ich folgende Fehlermeldung:

"Die 't_oic_prodat.PJ_NAME'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP-BY-Klausel enthalten ist."

Kann mir da jemand bei der korrekten Umformung der Abfrage weiterhelfen?

Danke und Gruß
Kai
 
Werbung:
AW: Sum und group by - was mache ich falsch?

Aus der Entfernung betrachtet, gibt es da eventuell gleichlautende Spalten in beiden Tabellen. Da weiß MySQL nicht mehr, welche Spalte gemeint ist. Um dies wieder zu definieren sind dann ALIAS notwendig. Das geht so:

an die Positionen der ? muss eine der Tabellen ALIAS hin. Das musst Du noch anpassen

t.
tr.


Code:
SELECT [COLOR=red][B]?[/B][/COLOR].pj_name,
       CAST([B][COLOR=#ff0000]?[/COLOR][/B].pj_nr AS nvarchar(12)) AS pj_nr,
       oic_user.getuserexchangename([B][COLOR=#ff0000]?[/COLOR][/B].portfolio_leiter) AS portfolio_leiter,
       oic_user.getuserexchangename([B][COLOR=#ff0000]?[/COLOR][/B].pj_leiter) AS pj_leiter,
       oic_user.getuserexchangename([B][COLOR=#ff0000]?[/COLOR][/B].team_controlling) AS [B][COLOR=#ff0000]?[/COLOR][/B].team_controlling,
       [B][COLOR=#ff0000]?[/COLOR][/B].status,
       projekt_typ,
       SUM(di1 + di2 + di3 + di4 + di5) AS summe_ratio,
       ms0_datum_plan,
       ms0_datum_ist,
       CASE
         WHEN ms1_datum_fc IS NOT NULL THEN
          ms1_datum_fc
         ELSE
          ms1_datum_plan
       END AS ms1,
       ms1_datum_ist,
       CASE
         WHEN ms2_datum_fc IS NOT NULL THEN
          ms2_datum_fc
         ELSE
          ms2_datum_plan
       END AS ms2,
       ms2_datum_ist,
       CASE
         WHEN ms3_datum_fc IS NOT NULL THEN
          ms3_datum_fc
         ELSE
          ms3_datum_plan
       END AS ms3,
       ms3_datum_ist,
       CASE
         WHEN ms4_datum_fc IS NOT NULL THEN
          ms4_datum_fc
         ELSE
          ms4_datum_plan
       END AS ms4,
       ms4_datum_ist,
       CASE
         WHEN ms5_datum_fc IS NOT NULL THEN
          ms5_datum_fc
         ELSE
          ms5_datum_plan
       END AS ms5,
       ms5_datum_ist
  FROM t_oic_prodat [B][COLOR=red]t[/COLOR][/B], 
          t_oic_prodat_ratio_ist [COLOR=red][B]tr[/B][/COLOR]
 WHERE projekt_typ = 'RS'
    OR projekt_typ = 'RM'
    OR projekt_typ = 'RT'
    OR projekt_typ = 'RA'
   AND (status IS NULL OR status IN ('', 'läuft'))
   AND t_oic_prodat_ratio_ist.quartal = 'Q ' + CASE
         WHEN MONTH(getdate()) BETWEEN 1 AND 3 THEN
          'I'
         WHEN MONTH(getdate()) BETWEEN 4 AND 6 THEN
          'II'
         WHEN MONTH(getdate()) BETWEEN 7 AND 9 THEN
          'III'
         WHEN MONTH(getdate()) BETWEEN 10 AND 12 THEN
          'IV'
       END + ' ' + YEAR(getdate())
 GROUP BY pj_name,
          pj_nr,
          pj_leiter,
          team_controlling,
          status,
          projekttyp,
          ms0_datum_plan,
          ms0_datum_ist
 ORDER BY projekt_typ

Ich habe jetzt nur ein paar wenige Stelle mit ?. markiert. Vor jede Tabellenspalte muss der Alias eingefügt werden. Iich denke, Du hast das Prinzip schon verstanden.

Grüße
Thomas
 
Werbung:
Zurück
Oben