"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

gesucht: sql-abfrage

BuX 08.01.2007 - 17:14 2088 18
Posts

BuX

gar nich lieb
Avatar
Registered: Nov 2001
Location: @work
Posts: 599
ich kann meine sql abfrage nirgends finden :D

noe, scherz beiseite:
ich habe n problem mit einer abfrage:
table in dem es u.a. die werte 'form', date und time gibt.

form hat werte zwischen 1 und 10, und jetzt brauch ich ne ausgabe, die mir 10 zeilen ausgibt mit den aktuellsten date-time feldern, jeweils eins mit form 1, eins mit form 2 ... bis 10 halt.

danke, BuX


edit: ahja, diese abfrage gibt mir nur die erste aus (und das is leider die aelteste eingegebene)
$abfrage="SELECT form, uschrift, beitrag, username, time, date,visits,zahl_beitrag FROM forum GROUP BY form ORDER BY date DESC, time DESC";
Bearbeitet von BuX am 08.01.2007, 17:52

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
dann mach aus desc ein asc

und frag pro forum ab und hängs mit union zusammen.

SELECT form, uschrift, beitrag, username, time, date,visits,zahl_beitrag FROM forum WHERE form =1 ORDER BY date ASC, time ASC LIMIT 10 UNION SELECT form, uschrift, beitrag, username, time, date,visits,zahl_beitrag FROM forum WHERE form =2 ORDER BY date ASC, time ASC LIMIT 10 UNION...

BuX

gar nich lieb
Avatar
Registered: Nov 2001
Location: @work
Posts: 599
herzlichen dank.. ich hab gar net dran dacht *doH* danke funzt :)

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
huha, ich such ein ähnliches statement :)

nämlich eines, welches mir einfach die ergebnisse von mehreren statements (die alle gleich viel rows zurückgeben) "merged". sowas wie union, nur dass die spalten der verschiedenen statements erhalten bleiben.

z.b. such ich mir die altersverteilung von personen heraus und will nach männlich/weiblich trennen. in dem ergebnis sollen die spalten "alter", "gesamt", "männlich", "weiblich" vorhanden sein. weil ich aber nicht weiß, wie ich das in einem statement machen soll, will ich die ersten beiden spalten mit einem statement und die nächsten 2 mit 2 anderen machen.

ungefähr klar? und hat wer eine lösung auch? :D tia!

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4281
huh? nix is klar bei mir. suchst du vielleicht ein join?

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
hm... ich such was, um statements zu joinen (und nicht tabellen). die wirkung soll ähnlich wie die eines joins sein, aber ich will statements dafür angeben.

aber klar, was ich als ergebnis haben will? folgende tabelle
Code:
Alter | Gesamt | Männlich | Weiblich
14 | 100 | 25 | 75

das ist alles das gleiche statement, nur leicht angepasst. deswegen such ich sowas.

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5219
Code:
SELECT distinct(alter) as Alter, 
(SELECT Count(*) from blafasl b1 where b1.alter = b.alter) as Gesamt, 
(SELECT Count(*) from blafasl b2 where b2.alter = b.alter and b2.geschlecht = "m") as Männlich, 
(SELECT Count(*) from blafasl b3 where b3.alter = b.alter and b3.geschlecht = "f") as Weiblich
FROM blafasl b;

sollte ja funktionieren, oder? (ich geh halt davon aus das alle informationen in einer Table stehn)

edit: In der Table blafasl stehn halt die Daten der Person, also Name, Adresse usw und eben auch Alter und Geschlecht.
Bearbeitet von tinker am 07.04.2008, 13:41

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Zitat von tinker
Code:
SELECT distinct(alter) as Alter, 
(SELECT Count(*) from blafasl b1 where b1.alter = b.alter) as Gesamt, 
(SELECT Count(*) from blafasl b2 where b2.alter = b.alter and b2.geschlecht = "m") as Männlich, 
(SELECT Count(*) from blafasl b3 where b3.alter = b.alter and b3.geschlecht = "f") as Weiblich
FROM blafasl b;

sollte ja funktionieren, oder? (ich geh halt davon aus das alle informationen in einer Table stehn)

nice attempt, hab ich auch schon probiert. nur die daten sind in 2 tabellen und der sql server meint, ich darf im select-teil keine subselects haben, die mehr als 1 row zurückgeben?

ich hab folgendes statement:

Code: PHP
SELECT 2008-YEAR(Klient.GeschaetztesGebJahr) AS AlterInJahren, COUNT(*) AS Gesamt
FROM Beratung INNER JOIN Klient ON (Klient_KlientID=KlientID)
WHERE Beratung.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000'
GROUP BY 2008-YEAR(Klient.GeschaetztesGebJahr)
ORDER BY 1

damit bekomm ich:

Code:
AlterInJahren | Gesamt
 14 | 341
 15 | 124

und so weiter. für männlich/weiblich nehm ich das gleiche statement und geb noch was in der where-klausel dazu und fertig. in einem statement weiß ich nicht, wie es geht, deswegen will ich mehr verwenden.
Bearbeitet von prayerslayer am 07.04.2008, 13:46

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9818
ich hab keine ahnung was du wirklich willst :confused:

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5219
hm, wie sind die daten auf die beiden tables aufgeteilt?
und die subselects sollten eh nur eine row bzw. nur einen wert zurückliefern

@ica: er hat ne table (ok, 2) in der alle personen aus wwi drin sind zu denen natürlich auch alter und geschlecht gespeichert sind. und jetzt will er halt wissen wieviele zb. 14 Jährige in diesem System erfasst sind und wieviele davon männlich und weiblich...
Bearbeitet von tinker am 07.04.2008, 13:49

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5219
damn quote :bash:

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
ah... heut ist kein guter tag.

ich hab in der klienten-tabelle ein geschaetztes geburtsjahr drin, daraus rechne ich mir das alter. in 2 tabellen sind die daten, weil nur die klienten gezählt werden sollen, die eine beratung in einem gewissen zeitraum in anspruch genommen haben.

ich hoff, der edit oben gibt ein bissi mehr aufschluss, sonst geb ichs nämlich auf und geh nach hause...

//edit: das geht sicher nicht, ich komm nämlich grad drauf, dass die anzahl an rows nicht immer die gleiche sein muss :bash: muss also eine andere lösung finden...
Bearbeitet von prayerslayer am 07.04.2008, 13:56

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5219
Code:
SELECT distinct(2008-YEAR(k.GeschaetztesGebJahr)) AS AlterInJahren,
(SELECT count(*) from Klient k2 inner join beratung b on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k2.GeschaetztesGebJahr and b.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Gesamt,
(SELECT count(*) from Klient k3 inner join beratung b1 on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k3.GeschaetztesGebJahr and k3.geschlecht = "maennlich" and  b1.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Maennlich,
(SELECT count(*) from Klient k4 inner join beratung b2 on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k4.GeschaetztesGebJahr and k4.geschlecht = "weiblich" and  b2.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Weiblich,
FROM Klient k 
ORDER BY 1

:)

edit: code gefixt
edit2: könnt sein das du im on des joins im subselect die tabelle angeben musst, weiß jetz aber nicht in welcher table KlientID und wo Klient_KlientID steht (habs schon so und so mal gesehn)
Bearbeitet von tinker am 07.04.2008, 14:05

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
Zitat von tinker
Code:
SELECT distinct(2008-YEAR(k.GeschaetztesGebJahr)) AS AlterInJahren,
(SELECT count(*) from Klient k2 inner join beratung b on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k2.GeschaetztesGebJahr and b.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Gesamt,
(SELECT count(*) from Klient k3 inner join beratung b1 on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k3.GeschaetztesGebJahr and k3.geschlecht = "maennlich" and  b1.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Maennlich,
(SELECT count(*) from Klient k4 inner join beratung b2 on (Klient_KlientID=KlientID) WHERE k.GeschaetztesGebJahr = k4.GeschaetztesGebJahr and k4.geschlecht = "weiblich" and  b2.Datum BETWEEN '2007-01-01T00:00:00.000' AND '2008-02-24T00:00:00.000') as Weiblich,
FROM Klient k 
ORDER BY 1

:)

edit: code gefixt

bam oida :eek: bist mei hawi, ich hab zwar auch eine lösung gehabt, die war aber komplizierter und hat länger gedauert. da hab ich nämlich wirklich die 3 statements mit joins zusammengehängt :)

danke!

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5219
Kleiner Schönheitsfehler:
Im äußersten Select solltest auch noch mit der Beratung joinen und auf Datum abfragen weil sonst kanns sein das er die subselects um sonst macht wenn es zb 13jährige Klienten gibt aber noch keiner von denen bei ner Beratung war.

Ansonsten: np, man hat ja Zeit in der Arbeit. :D
Bearbeitet von tinker am 07.04.2008, 14:30 (logik)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz