Zum Inhalt wechseln


Foto

SQL Datenbank Suche

MS SQL

  • Bitte melde dich an um zu Antworten
22 Antworten in diesem Thema

#1 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 21. Oktober 2014 - 11:04

Hallo,

Ich hänge gerade dabei, eine Datenbank zu Sortieren.

 

Aufbau der Tabelle die ich Sortieren will:

 

ID USER ABO ....

 

Nun gibt es jede id mehrfach, z.b

 

ID USER ABO

1   test1   RT

1   test1   AG

1   test1   AG

2   test2   AG

3   test3   RT

3   test3   AG

.....

 

Nun will ich folgenes ausgegeben haben:

 

Jede ID muss ein Abo RT und AG haben, wobei AG mehrfach vorkommen kann.

 

ausgegeben werden sollen ALLE Id´s wo es zwar AG´s gibt aber keine RT wie hier bei ID 2 der fall...

 

Und das ganze soll nur die Datensätze der letzten 7 tage anzeigen

 

 

wie kann man das am besten umsetzen?

 

 

Habe mir gedacht eine 2 Tabelle anzulegen hilft evtl.

 

so das ich:

 

INSERT INTO `TABELLE_NEW` (ID, USER, ABO)
SELECT `ID`, `USER`, `ABO` FROM `TABELLE1`
WHERE (DATA) > 2014-04-14 00:00:00.000

 

 

nur weiß ich nicht weiter :/


Bearbeitet von whoami, 21. Oktober 2014 - 11:07.


#2 NilsK

NilsK

    Expert Member

  • 12.322 Beiträge

 

Geschrieben 21. Oktober 2014 - 12:23

Moin,

 

zunächst mal ist deine Tabelle offenkundig nicht normalisiert. Das macht den Umgang damit unnötig kompliziert.

 

Dann: Wenn du nach Datum filtern möchtest, muss es natürlich in jeder Zeile auch ein Datumsfeld geben. Ist das gegeben?

 

Und schließlich musst du mit einer verschachtelten Abfrage arbeiten, auch "Sub-Select" genannt. Mit dem ersten Select identifizierst du alle IDs, für die ein Eintrag "AG" existiert und mit dem zweiten davon dann diejenigen, die kein "RT" haben. Die Klausel "NOT IN" sollte dir dabei helfen (zeige mir nur diejenigen aus Abfrage 1, die in Abfrage 2 nicht auftauchen).

 

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#3 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 21. Oktober 2014 - 12:34

Wenns nur um die geht, die kein RT haben, wäre folgendes möglich: Mit Distinct die ID eindeutig ziehen und dann mit nem Left Join nur die Datensätze mit RT verknüpfen und das ganze dann auf NULL abfragen...

 

... und zum "DATA": Siehe Nils' Hinweis :)


My name is Frank, you can say you to me.

#4 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 21. Oktober 2014 - 12:48

Feld DATA ist gegeben ja.

 

vor dem Feld ID gibt es noch ein Feld mit namen UID, diese ist pro zeile einmalig also die eindeutige ID

 

nur wie ich mir jetzt das so ausgeben kann ist mir noch nicht ganz klar :/



#5 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 21. Oktober 2014 - 13:54

Irgendwie so in der Art:

 

SELECT A1.ID, T1.Abo FROM (SELECT DISTINCT T1.ID, "RT" AS AboRT FROM T1) AS A1
LEFT JOIN T1 ON (A1.AboRT = T1.Abo) AND (A1.ID = T1.ID)
WHERE ((T1.Abo) Is Null)
 


Bearbeitet von Cybquest, 21. Oktober 2014 - 13:55.

My name is Frank, you can say you to me.

#6 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 22. Oktober 2014 - 11:46

hätte vieleicht dazu schreiben sollen, das alles in einer Tabelle ist



#7 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 22. Oktober 2014 - 11:56

Ja... und?

 

Der Select, den ich da geschrieben hab, holt auch nur Daten aus einer Tabelle (hab ich halt nur T1 genannt).

A1 ist ein Subselect auf T1.


My name is Frank, you can say you to me.

#8 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 22. Oktober 2014 - 12:10

Msg 207, Level 16, State 1, Line 1
Invalid column name 'RT'.
 

 

:/

 

RT ist doch gar kein column, ist doch ein eintrag von ABO


Bearbeitet von whoami, 22. Oktober 2014 - 12:10.


#9 NilsK

NilsK

    Expert Member

  • 12.322 Beiträge

 

Geschrieben 22. Oktober 2014 - 12:15

Moin,

 

ersetze die beiden Anführungsstriche mal durch Apostrophe (das Zeichen über der #-Taste, nicht den Akzent).

 

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#10 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 22. Oktober 2014 - 12:21

hab ich gerade, ging - nun guck ich gerade warum er mir genau 1 ergebnis zeigt und da ist ABO = NULL

also weder RT noch AG also auch so nen fehler gefunden :)

 

aber sonst zeigt er die anderen nicht an und es gibt definitiv welche



#11 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 22. Oktober 2014 - 12:28

In Deinen Testdaten hat ja nur die ID 2 keinen RT-Eintrag. D.h. die Abfrage liefert genau einen Datensatz mit ID 2 und ABO = NULL...

War das nicht das, was rauskommen sollte? Die IDs, die keinen RT-Eintrag haben?

 

... und wenn dich das ABO=NULL stört, lass es einfach weg ;)

(SELECT A1.ID FROM...)


Bearbeitet von Cybquest, 22. Oktober 2014 - 12:30.

My name is Frank, you can say you to me.

#12 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 22. Oktober 2014 - 12:32

Ja, Testdaten sind ja nur ein paar, gibt hunderte id´s

 

und jede ID MUSS AG und RT haben

AG kann jede ID 5 oder what ever haben

RT (SOLLTE) sie genau 1x haben

 

wenn aber bei einer ID keine RT Existiert sprich AG ist da aber RT fehlt soll diese ID ausgegeben werden.

 

RT gibt es in dem fall nicht also auch kein Leeres Feld es Existiert einfach kein eintrag in der Datenbank



#13 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 22. Oktober 2014 - 13:14

... und was ist jetzt noch Dein Problem?

 

Die Abfrage spuckt IDs aus, die keine RTs haben aber auf Grund anderer ABO-Einträge (vermutlich dann immer AG) überhaupt existieren...

Es geht doch nur um IDs, die kein RT haben, oder nicht?

Dass ein NULL-Feld dabei raus kommt, wenn Du die ABO-Spalte mit anzeigen lässt, liegt am LEFT JOIN... das heisst ja nicht, dass es dafür einen Datensatz in der Tabelle geben müsste.

 

Entweder versteh ich Dein Problem nicht, oder Du die Lösung nicht...


My name is Frank, you can say you to me.

#14 whoami

whoami

    Newbie

  • 11 Beiträge

 

Geschrieben 22. Oktober 2014 - 13:52

ah mein fehler.

 

und wie mann ich mir in der ausgabe zusätzlich auch die user felder auslesen?

 

wenn ich am anfang select * mache bekomme ich bei dem Feld User auch NULL zurück



#15 NilsK

NilsK

    Expert Member

  • 12.322 Beiträge

 

Geschrieben 22. Oktober 2014 - 14:03

Moin,

 

hm, wird wohl mal Zeit für einen SQL-Grundkurs, oder?

SELECT A1.ID, A1.User, T1.Abo FROM ...

sollte ausreichen.

 

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!




Auch mit einem oder mehreren der folgenden Tags versehen: MS SQL