verwendetes Datenbanksystem: SQLite
Hey,
ich habe eine SQLite Datenbanktabelle, die ungefähr wie folgt aussieht
KeywordId (int) | Zugriffe (int)
Ich würde nun gern die Zugriffe für bestimmte KeywordIds aufsummieren und diejenige Id mit den höchsten Zugriffszahlen inklusive der aufsummierten Zugriffszahl innerhalb eines Clusters auswählen.
Beispiel:
KeywordId (int) | Zugriffe (int)
\==============================
1 | 10
2 | 5
3 | 25
4 | 45
5 | 10
6 | 1
\===============================
Nun sollen die Ids (1,2,3) und (4,5,6) zu einem Cluster zusammengefügt werden. Als Ergebnis hätte ich dann gern
KeywordId (int) | Zugriffe (int)
\==============================
3 | 40
4 | 56
\===============================
Ist sowas irgendwie mit SQLite Statements möglich? Hatte an irgendwas in Richtung Group By und Having mit ein paar CASE Statements gedacht, aber ich hab leider keine Ahnung wie das syntaktisch aussehen sollte und ob das überhaupt klappen kann.
Viele Grüße
Pascal
PHP Tutorials zum PHP lernen
SELECT SUM(Zugriffe) as Zugriffe
FROM (
SELECT Zugriffe FROM ... WHERE id = 1
UNION
SELECT Zugriffe FROM ... WHERE id = 2
UNION
SELECT Zugriffe FROM ... WHERE id = 3
) as SUB
UNION ALL
SELECT SUM(Zugriffe) as Zugriffe
FROM (
SELECT Zugriffe FROM ... WHERE id = 4
UNION
SELECT Zugriffe FROM ... WHERE id = 5
UNION
SELECT Zugriffe FROM ... WHERE id = 5
) as SUB
Dies habe ich in MySQL getestet, aber ich denke das müsste auch in anderen Datenbanken funktionieren.. Schonmal als Ansatz!
Per SQL kannst du die Cluster folgendermaßen ermitteln:
SELECT
SUM(CASE WHEN KeyWordId IN (1,2,3) THEN Zugriffe ELSE 0 END) AS Cluster123,
SUM(CASE WHEN KeyWordId IN (4,5,6) THEN Zugriffe ELSE 0 END) AS Cluster456
FROM
<Tablename>
Falls du die Ergebnisse wie in deinem Beispiel in einzelnen Zeilen benötigst, kannst du auch folgendes schreiben:
SELECT
'Cluster123' AS KeyWordIdCluster, SUM(Zugriffe) AS Zugriffe
FROM
<Tablename>
WHERE
KeyWordId IN (1,2,3)
UNION ALL
SELECT
'Cluster456' AS KeyWordIdCluster, SUM(Zugriffe) AS Zugriffe
FROM
<Tablename>
WHERE
KeyWordId IN (4,5,6)
Mit SQLLite habe ich keine Erfahrungen, wie die konkrete Syntax dort aussieht kann ich dir leider nicht sagen.
Was spricht für die "Reihen" gegen GroupBy?
SELECT
CASE
WHEN Keyword IN(1,2,3) THEN 'A'
WHEN Keyword IN(4,5,6) THEN 'B'
END as 'Keyword',
SUM(Zugriffe) as 'Zugriffe' FROM data
GROUP BY
CASE
WHEN Keyword IN(1,2,3) THEN 'A'
WHEN Keyword IN(4,5,6) THEN 'B'
END
lg Lion
Hallo Lion1984,
deine Variante gefällt mir, auf ein bedingtes GroupBy bin ich gar nicht gekommen. Noch etwas kompakter ist folgende Umformulierung deiner Variante:
SELECT
CASE
WHEN KeyWordId IN(1,2,3) THEN 'A'
WHEN KeyWordId IN(4,5,6) THEN 'B'
END as Cluster,
SUM(Zugriffe) AS Zugriffe
FROM
<Tablename>
GROUP BY
Cluster
Edit: Scheint so nicht in jedem Datenbanksystem zu laufen, getestet auf SQL Anywhere 11, dort geht es. Auf dem MS SQLServer allerdings nicht.
Naja, hast du das auch ausprobiert? Die Spaltenangabe funktioniert bei "GROUP BY" nicht, das "Cluster" kannst du bei Order By verwenden.
lg Lion
Natürlich habe ich es ausprobiert, sonst würde ich es nicht posten. Getestet habe ich es mit SQL Anywhere 11, dort läuft es.
Ich habe es jetzt auch noch mal auf dem SQLServer getestet, da geht es dann tatsächlich nicht in dieser Form.