Laden...

Daten in SELECT Statement clustern

Erstellt von Hirnhamster vor 12 Jahren Letzter Beitrag vor 12 Jahren 835 Views
H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren
Daten in SELECT Statement clustern

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

R
65 Beiträge seit 2011
vor 12 Jahren

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!

I
8 Beiträge seit 2011
vor 12 Jahren

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.

L
770 Beiträge seit 2006
vor 12 Jahren

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

I
8 Beiträge seit 2011
vor 12 Jahren

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.

L
770 Beiträge seit 2006
vor 12 Jahren

Naja, hast du das auch ausprobiert? Die Spaltenangabe funktioniert bei "GROUP BY" nicht, das "Cluster" kannst du bei Order By verwenden.

lg Lion

I
8 Beiträge seit 2011
vor 12 Jahren

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.