Zum Inhalt wechseln


Foto

SQL Abfragen

Lerngruppe MS SQL

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

#1 Cahide

Cahide

    Newbie

  • 10 Beiträge

 

Geschrieben 15. November 2014 - 09:11

Hallo,

könnte mir jemand bei der Aufgabenstellung helfen. ich komm nicht auf die richtige Lösung.

 

Aufgabenstellung:

 How many states brought forth a president born before 1900?

Meine Lösung:

SELECT (name(state)) FROM state INNER JOIN president ON birth_year <= 1900;

 

 

-- Table: state

 
-- DROP TABLE state;
 
CREATE TABLE state
(
  id serial NOT NULL,
  name character varying(15) NOT NULL,
  admin_id integer,
  year_entered integer,
  CONSTRAINT prim_key_state PRIMARY KEY (id),
  CONSTRAINT state_fk1 FOREIGN KEY (admin_id)
      REFERENCES administration (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT check_year_entered CHECK (year_entered >= 1600 AND year_entered <= 2100)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE state
  OWNER TO postgres;
COMMENT ON TABLE state
  IS 'States, added in year and under which president.';
 
 
 
 
-- Table: president
 
-- DROP TABLE president;
 
CREATE TABLE president
(
  id serial NOT NULL,
  name character varying(20) NOT NULL,
  birth_year integer,
  years_served smallint,
  death_age smallint,
  party character varying(10),
  state_id_born integer,
  CONSTRAINT prim_key_pres PRIMARY KEY (id),
  CONSTRAINT president_fk1 FOREIGN KEY (state_id_born)
      REFERENCES state (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT check_birth_year CHECK (birth_year >= 1600 AND birth_year <= 2100),
  CONSTRAINT check_death_age CHECK (death_age > 20 OR death_age IS NULL)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE president
  OWNER TO postgres;
COMMENT ON TABLE president
  IS 'President name, birth year etc.';
 
-- Index: ipres
 
-- DROP INDEX ipres;
 
CREATE INDEX ipres
  ON president
  USING btree
  (party COLLATE pg_catalog."default");
 
 
Eine Andere Frage: darf ich hier überhaupt Fragen zum Thema SQL Abfragen stellen oder bin ich im falschem Film?


#2 zahni

zahni

    Expert Member

  • 16.513 Beiträge

 

Geschrieben 15. November 2014 - 12:16

Hallo,

 

was ist eigentlich das Ziel der Fragen?

Du arbeitest doch nicht an einem konkreten Problem, oder?

Deine Beispiele hören sich wie aus einem Lehrbuch abgeschrieben an.

Wenn Du übst und lernst, installiere einen SQL-Server und probiere die Lösungsansätze selbst aus.

Dabei können wir nicht helfen.

 

-Zahni


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#3 Cahide

Cahide

    Newbie

  • 10 Beiträge

 

Geschrieben 15. November 2014 - 12:44

Das sind meine Hausaufgaben.

Ich will ja keine Lösung. sondern einfach nur Hilfestellung oder Tipps. 

Ich habe gedacht, hier kann ich um Hilfe erfragen, deswegen hatte ich ja gefragt, ob ich hier solche fragen stellen darf.



#4 Cybquest

Cybquest

    Expert Member

  • 1.888 Beiträge

 

Geschrieben 15. November 2014 - 14:39

Du darfst Fragen stellen. Allerdings ist oben Dein einziges Fragezeichen an der Frage, ob Du Fragen stellen darfst ;-)

Und die Frage "könnte jemand ...helfen?" (wenn wir uns hier das Fragezeichen vorstellen) ist doch etwas zu allgemein.

Wo hakt's denn genau? Ist der SQL-Code Teil der Aufgabe oder soll das u.a. Deine Lösung repräsentieren?

 

Da die Fragestellung mit "How many..." anfängt, wäre möglicherweise ein "Count(...)" ein brauchbarer Hinweis für Deinen Code.


... und bei nem Inner Join sollten mit "ON" die in den zu joinenden Tabellen referenzierten Felder angegeben werden, nicht die WHERE-Klausel...


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

#5 Pathomorph

Pathomorph

    Junior Member

  • 75 Beiträge

 

Geschrieben 15. November 2014 - 16:00

Erstmal musst du überlegen, was die Verbindung zwischen den 2 Tabellen ist.

In der Tabelle "president" ist ein Feld "state_id_born". Dort ist sicher die id aus der Tabelle "state" gespeichert, damit Daten nicht redundant gespeichert werden.

 Genau diese Verbindung wird mit "ON" beschrieben:

 

SELECT blabla FROM president INNER JOIN state ON president.state_id_born = state.id

 

Dann kommt die WHERE-Klausel, um die Datenmenge einzuschränken bzw. zu filtern:

 

... WHERE president.birth_year <= 1900

 

jetzt ist die Frage nach der Anzahl dieser Staaten:

Wie Cyberquest schon sagt: COUNT!

 

--> SELECT Count(*) FROM president INNER JOIN state ON president.state_id_born = state.id WHERE president.birth_year <= 1900

 

 

Kleiner Tip: SQL-Statements lieber strukturieren, damit du später noch durchblickst:

 

SELECT

      Count(*)

FROM

      president

      INNER JOIN state

            ON president.state_id_born = state.id

WHERE 

      president.birth_year <= 1900



#6 Cybquest

Cybquest

    Expert Member

  • 1.888 Beiträge

 

Geschrieben 15. November 2014 - 16:31

Hmmm... da es "Hausaufgaben" sind, wollte ich nur nen Denkanstoß geben. Ihm die fertige Lösung zu präsentieren, halte ich eigentlich für nicht zielführend! ... aber schön erklärt...


...wobei m.E. eh ein Fehler in Deiner Lösung ist, da da ja die Präsidenten gezählt werden und nicht die Staaten... oder seh ich das falsch? ;)


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

#7 Cahide

Cahide

    Newbie

  • 10 Beiträge

 

Geschrieben 15. November 2014 - 17:12

Fragen werden mit Fragezeichen beendet. Hab´s vergessen, wird in Zukunft nicht mehr passieren :) .

Genau, der SQL Code sollte meine Lösung repräsentieren, habe aber die  Aufgabe schon gelöst:

 

SELECT COUNT(DISTINCT(state_id_born)) FROM president WHERE birth_year <1900;

Lösung = COUNT 14 ( sollte laut Lösungen richtig sein).

 

Mein Problem liegt bei der Syntax von Queries ( habe erst gestern angefangen mit SQL(PostgreSQL) zu arbeiten).

 

Trotzdem Danke für die Lösung. Allerdings möchte ich bitte keine Lösungen, denn ich will es ja auch verstehen.


  • Cybquest gefällt das

#8 Pathomorph

Pathomorph

    Junior Member

  • 75 Beiträge

 

Geschrieben 15. November 2014 - 17:59

Richtig, Cyberquest!  ;-)





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