SQL Distrinct richtig anwenden

Lothar1951

Mitglied
Ich habe ein Problem, dass mich zur Verzweiflung gebracht hat.

SELECT distinct Sprache from Standort

das funktioniert, aber ich möchte zusätzlich noch das Datum abfragen. Wenn ich

SELECT distinct Sprache, Datum from Standort

eingebe, kommt das Datum aufeinanderfolgend und die dazugehörige Sprache. Wenn ich

SELECT distinct Sprache from Standort where year(Datum) = 2016

eingebe, kommt es richtig, aber wenn ich z.B. 2015 oder ein beliebiges anderes Jahr eingebe, bei dem die DB noch gar nicht existierte bekomme ich nicht etwa "0", sondern ein falsches Ergebnis. Bitte um Hilfe!!!
Anbei ein Screenshot. Die Sprache, die ich nur einmal möchte, will ich danach nach Jahr und Monat sortieren.
 

Anhänge

  • SQL.jpg
    SQL.jpg
    184,1 KB · Aufrufe: 12

Yaslaw

alter Rempler
Moderator
DISITNCT bezieht sich auf die ganze Zeile.
Wenn du detailierter angeben möchtest, was du haen willst, dann geht das über den GROUP BY

Die folgenden liefern jeweils das gleiche Befehle Resultat
SQL:
select distinct sprache from standort
select sprache from standort group by sprache

select distinct sprache, datum from standort
select sprache, datum from standort group by sprache, datum

Leider siehe ich aus deinem Text nixht heraus, was du denn als Resultat haben willst.
Ich deute mal, dass du für jede Sprache den letzten Eintrag haben willst
SQL:
select 
    sprache, 
    max(datum) as max_datum 
from standort 
group by sprache
 

Lothar1951

Mitglied
Ich möchte nach Sprache selektieren. Jede Sprache soll monatlich nur einmal auftreten, egal wie oft sie enthalten ist.

Gruß
Lothar
 

Yaslaw

alter Rempler
Moderator
SQL:
SELECT sprache,
    MONTH(datum) AS monat,
    YEAR(datum) AS jahr
FROM standort
GROUP BY
    sprache,
    MONTH(datum),
    YEAR(datum)
 

Yaslaw

alter Rempler
Moderator
Richtig. Das ist das, was ich verstanden habe dass du es willst.
Pro Monat (dazu gehört für mich auch ein Jahr) und Sprache nur eine Zeile.

Mach sonst einmal Datenbeispiel mit Tabellen. und dem gewünschten Resultat

So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1 | 1 | MA1
2 | 1 | MA2
3 | 2 | MA3

Tabelle Firma
id | name
---------------------
1 | firma1
2 | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1 | firma1 | 2
2 | firma3 | 1
 

Lothar1951

Mitglied
Ich lade mal ein Beispiel der Tabelle hoch. Ich möchte monatlich und jährlich die Sprache nur einmal sehen.
 

Anhänge

  • hc_008.jpg
    hc_008.jpg
    97,7 KB · Aufrufe: 11

Yaslaw

alter Rempler
Moderator
Mach ein Beispiel wie das Resultat aussehen soll. Denn ich verstehe aus deinem Satz genau das, was ich oben bereits gelöst habe.
 

Yaslaw

alter Rempler
Moderator
Achso. Du willst due ANZAHL und nicht ein DISTINCT!
zudem alle Monate, auch wenn keine Einträge vorhanden sind.

Als erstes erstellst du eine Tabelle. Ich nenne sie mal monate. Darin hast du die Monatsnummer und den Monatsname. Diese brauchst du, damit du auch die Monate anzeigen kannst, die keine Einträge in der standort-Tabelle haben
Code:
monate:

nr | monat
----------
1 | Januar
2 | Februar
...
12 | Dezember

Und dann kannst du einfach mittels eines LEFT JOIN, kombiniert mit einem GROUP BY die Abfrage zusammenstellen
SQL:
SELECT
      monate.monat,
      COUNT(standort.sprache) AS laender
FROM
      monate
      LEFT JOIN standort
            ON monate.nr = MONTH(standort.datum)
WHERE
      YEAR(standort.datum) = 2015
GROUP BY
      monate.monat
ORDER BY
      monate.nr