Zum Inhalt springen

Verzwickte Abfrage in SQL


kaptenkirk.w

Empfohlene Beiträge

Hi,

momentan steh ich anscheinend gewaltig auf der Leitung, aber ich komm einfach nicht auf die richtige Abfrage :-(

also: es geht um eine Statistik-geschichte über Webseiten in ASP mit ner Access DB

Zwei Tabellen:

1. describing mit url, url-nr und title

2. statistics mit url-nr, total, week und ner menge unwichtigem statistik zeugsl

nun kommt die Abfrage:

ich brauche die top und bottom 10 sites der jeweiligen letzen Woche.

also:

von jeder url die eingetragen ist, brauch ich jeweils die der letzen woche und die dann sortiert nach der total nr.

ich hoffe das war verständlich :-)

Bin ja mal gespannt ob einer von euch draufkommt, aber so wie ich euch kenn bestimmt.

Wär nett wenn mir jemand auf die Sprünge helfen könnte :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine Formulierung ist nicht ganz eindeutig.

Ich vermute aber mal, dass du die 10 meistbesuchten und 10 am wenigsten besuchten URLs ausgeben willst. Und ich gehe davon aus das du in der Lage bist eine Abfrage mit folgendem Inhalt zu erstellen:

URL Anzahl Woche/Datum/etc.

xxxxx xxxxx xxxxxxxx

xxxxx xxxxx xxxxxxxx

xxxxx xxxxx xxxxxxxx

Und davon möchtest du nun die TOP10/LAST10 Zeilen haben, bezogen auf die Werte im Feld Anzahl. Richtig?

==> Die ersten und letzten 10 musst du in jeweils eine Abfrage aufteilen:


SELECT TOP 10 t.Wert

FROM tabelle t order by Wert;


SELECT TOP 10 t.Wert

FROM tabelle t order by Wert desc;

Wenn du dem "Access-SQL" mächtig bist, dann kannst du auch folgende Anweisung direkt eingeben:

SELECT TOP 10 t.Wert

FROM Tabelle t order by Wert desc

union

SELECT TOP 10 t.Wert

FROM Tabelle t order by Wert 

Aufpassen: Das Order By ist bei UNION-Abfragen sehr trickreich.

Die SQL-Anweidung muss natürlich an deine Feldnamen angepasst werden.

Hoffe das hilft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke, aber das mit dem desc und order is mir klar.

es geht um die Abfrage an sich, weil wenn ich z.b. das max von week abfrage, damit ich die statistik der jeweils letzen woche krieg, dann bringe ich die DAZUGEHÖRIGE total nicht mehr rein, (weil Agregatfunktion), und ohne total kann ich dann nicht nach top und bottom 10 sortieren.

also so ungefähr:

SELECT DISTINCTROW describing.url, Max(statistics.week) AS [Max von week]

FROM describing INNER JOIN statistics ON describing.[url-nr] = statistics.[url-nr]

GROUP BY describing.url;

das ist mein Problem, ich krieg die total nicht rein, und das *zensuuur* Access kann anscheinend nichts anderes sinnvolles :-(

hoffe jetz ist das Problem verständlicher

Link zu diesem Kommentar
Auf anderen Seiten teilen

ACH SO!

Jetzt wirds etwas klarer. Wie wäre es mit einer SubQuery?


SELECT describing.Title, describing.url, statistics.total, statistics.week

FROM statistics INNER JOIN describing ON statistics.[url-nr] = describing.[url-nr]

WHERE (((statistics.week)=(select max(week) from statistics)));

Jetzt hast du ein Format á la (Title, Total, Week):

Title1 250 25

Title2 250 25

...

Wobei die Woche der größte Wert aus der Tabelle Statistics über alle Datensätzte ist (nicht seitenbezogen)

Das ganze nun als Abfrage Speichern und die o.g. Methode verwenden.

---

Ich hoffe, ichs jetzt richtig verstanden!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guuuut, du bist gut, der war schon nicht schlecht, schon ganz nah dran scheint mir,

aaaabber:

des gibt mir halt nur einen datensatz zurück, soweit war ich auch schon, aber ich brauch ja ALLE Urls mit jeweiliger max.week und zugehöriger total,

damit ichs auch noch für top 10 und bottom 10 sortieren kann :-(

Hilfe ist das ein Mist *heul*

Link zu diesem Kommentar
Auf anderen Seiten teilen

In der GROUP BY Klausel kannst Du entweder eine Aggregatfunktion verwenden oder Du musst zwingend ALLE Felder angeben.


SELECT DISTINCTROW describing.url, Max(statistics.week) AS [Max von week]

FROM describing INNER JOIN statistics ON describing.[url-nr] = statistics.[url-nr]

GROUP BY max(statiscs.week);

oder

SELECT DISTINCTROW describing.url, Max(statistics.week) AS [Max von week]

FROM describing INNER JOIN statistics ON describing.[url-nr] = statistics.[url-nr]

GROUP BY describing.url, max(statiscs.week);

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke hades, daß du auch helfen willst, aber auch deine zwei varianten mag mein liebes *grrrrrrr* Access nicht!

Er sagt mir:

can not have aggregate funktion in Group by clause!

Langsam glaub ich daß es wirklich nicht funktioniert!

Dabei ist es doch gar nicht so schwer was ich will, einfach nur die top und bottom der letzen wochen :-(

Ich sitze über dem Problem seit über einer Woche und morgen(!!!) soll ich das Projekt abgeben, ich hab keine Ahnung wie ich das noch schaffen soll. Bis auf die Abfrage ist alles erledigt, war ein großes Projekt, und daran scheiterts jetz?!? Ich glaub ich krieg nen Anfall

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du bitte dein Ziel nochmal genau nennen.

Zuerst schreibst du:

"ich brauche die top und bottom 10 sites der jeweiligen letzen Woche."

und dann:

aber ich brauch ja ALLE Urls mit jeweiliger max.week und zugehöriger total,

damit ichs auch noch für top 10 und bottom 10 sortieren kann

--> Und warum dieses DISTINCTROW?

----------------

Ich denke du willst:

im 1. Schritt:

Eine Zeile pro URL, mit

-> "größter" bzw. letzte Woche

-> Total für diese URL (Enthält die Anzahl der Seitenaufrufe?)

Im 2. Schritt

Nur die URL's von Schritt1, mit den Top 10 bzw. Bottom 10 im Feld Total.

Und welche Woche möchtest du nun haben? Nur die letzte oder die jeweils letzte? Was passiert, wenn es zu einer URL keine "letzte" Woche gibt, weil sie nicht angeklickt wurde?

Die TOP10/BOTTOM10 bziehen sich auf die Totals unabhängig von der Woche, oder? (wie sonst)

Kannst du mal die fertige Ausgabe aufschreiben: (z.B.)

(Top/Bottom10)

URLxx 2000x Woche20

URLxx 1800x Woche20

...

URLxx 10x Woche19

URLxx 5x Woche20

IST DAS RICHTIG?

(Das wäre ja eine Statistik, die ich selbst gefälscht hätte :-)

Warum nimmst du nicht nur die URL's, die in der letzten Woche auch verwendet wurden. Dann wäre es eine saubere Statistik!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, irgendwie ist es schwierig des zu erklären anscheinen, also ich versuch es nochmal:

ASP Programm mit Access DB

in der DB werden statistik daten gesammelt.

aufgrund der statistikdaten (wie oft wurde eine seite angeklickt, wie war die bandbreite bla bla) errechnet sich für jede url in jeder woche eine totalnr. die sozusagen die bewertung der seite ist.

so, jetzt will ich ausgeben:

1) die besten und schlechtesten Seiten überhaupt

also:

mySQLtop = "SELECT [statistics].[total], [describing]. FROM describing INNER JOIN statistics ON [describing].[url-nr]=[statistics].[url-nr] ORDER BY 1 DESC;"

mySQLtop2 = "SELECT [statistics].[total], [describing]. FROM describing INNER JOIN statistics ON [describing].[url-nr]=[statistics].[url-nr] ORDER BY 1;"

gut, macht mir ein sauberes ergebnis und gibt mir die besten und schlechtesten seiten, egal von welcher woche.

Um das jetzt zu verfeinern, will ich zusätzlich nochmal die besten und schlechtesten seiten haben (ausgehend von der totalnr), aber nicht von allen wochen, sondern nur daten von der letzen woch (es gibt für jede url, für jede Woche eine totalnr)

also möchte ich gerne so ein Ergebnis ungefähr haben (das muß so ausschauen, damit ich noch auf bzw absteigend sortieren kann für top und bottom):

url     max(week)     total

www.bla.de    25     65

www.iao.de    24     68

www.koi.de    25     70

usw usw.

vorher sehen die tabellen so aus:

url     max(week)     total

www.bla.de    14    64

www.bla.de    15     80

www.bla.de    17     54

www.bla.de    25     65

www.iao.de    13     74

www.iao.de    24     68

www.koi.de    20     53

www.koi.de    25     70

also ich will einfach nur, jeweils eine url von jeder, davon die max(week) und die totalnr die zu der jeweiligen woche gehört

ist es jetzt klarer oder soll ichs nochmal versuchen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jau, klar - warum schreibst du nicht das hier?

Abfrage vQueryLastWeek


SELECT describing.Title, describing.url, statistics.total, statistics.week

FROM statistics INNER JOIN describing ON statistics.[url-nr] = describing.[url-nr]

WHERE (((statistics.week)=(select max(week) from statistics s2 where s2.[url-nr]=statistics.[url-nr])));

Das ist m.E. die erste Tabelle. (obwohl die Subquery im ersten Moment ein wenig unsinnig aussieht funktionierts bei meinen Beispieldaten...) Du sagst aber: "es gibt für jede url, für jede Woche eine totalnr" Wirklich? Warum musst du dann die Max_Woche je URL-Ermitteln? Der 2.Teil ist ein wenig komplizierter als zunächst angenommen: Abfrage vTOP10

SELECT TOP 10 vQueryLastWeek.url, vQueryLastWeek.total, vQueryLastWeek.week

FROM vQueryLastWeek

ORDER BY vQueryLastWeek.total DESC;

Abfrage vBOTTOM10

SELECT TOP 10 vQueryLastWeek.url, vQueryLastWeek.total, vQueryLastWeek.week

FROM vQueryLastWeek

ORDER BY vQueryLastWeek.total;

Abfrage vTB20

SELECT * from VTOP10

UNION

SELECT * from VBOTTOM10 order by total desc

Macht insgesamt 4 Abfragen: Pass auf, wenn du versuchen solltest die TOP10 und BOTTOM10 in eine UNION-Abfrage zu kombinieren - da kommen die ulkigsten Ergebnisse raus!!!

So wars das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

s2 ist nur ein Alias für die Tabelle statistics.

Da wir ja eine Unterabfrage auf die gleiche Tabelle machen, so muss doch gesagt werden welche Felder er zum Vergleich nehmen soll. Mit dem Alias kann man das angeben. (Der Name ist egal - hätte auch irgendwie anders heissen können (z.B. stat2 oder nur stat).

P.S.: Ich habe oben den Post nochmal aktualisiert. Wegen des TOP/BOTTOM - Problems. Das ist äußerst seltsam in Verbindung mit dem UNION (vollkommen zufällige Werte!!!)

Link zu diesem Kommentar
Auf anderen Seiten teilen

So mein lieber Olli-Master

ich verbeuge mich vor dir, ich rutsche auf den Knien und du bist ab jetzt mein absoluter SQL Guru :-)

du bist mein Lebensretter du bist: simply the best!!!

und du trägst deinen Master zu recht im Namen!!!!

Ich werd jetz mit meinem Schlapptop unterm Arm heimgehen, und mich mit meiner Schmusekuscheldecke auf die Couch schmeißen und dann werd in aller ruhe mein Programm zu ende schreiben, und das alles dank dir!!!

Und morgen geb ichs ab und sag, daß mir der Master of SQL geholfen hat :-)

ne, im ernst, danke, mein kopf war schon in der schlinge sozusagen :-))), ein haufen Leute warten schon sabbernd und gierig auf das ding und nur an der blöden abfrage hats gehangen.

Also, lies weiter fleißig Forum, falls ich wieder mal nen hänger hab :-)

DANKE *fühldichgeknutschtknuddeltvonmir*

Kirki :e@sy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das weis ich, nur leider hat mein Chef auf Access bestanden, aber das ganze Ding soll in der Zukunft eh mal mit nem SQL-Server laufen und in C# umgeschrieben werden...

Für normales SQL hätt ich auch ne Lösung gehabt, nur daß mir das *zensur* Access das nicht gefressen hat *grml*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...