Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Daten in SELECT Statement clustern
Hirnhamster
myCSharp.de - Member



Dabei seit:
Beiträge: 105

Themenstarter:

Daten in SELECT Statement clustern

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
RaphaelH
myCSharp.de - Member



Dabei seit:
Beiträge: 66

beantworten | zitieren | melden


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!
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von RaphaelH am .
private Nachricht | Beiträge des Benutzers
IUndisposable
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von IUndisposable am .
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
IUndisposable
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von IUndisposable am .
private Nachricht | Beiträge des Benutzers
Lion1984
myCSharp.de - Member



Dabei seit:
Beiträge: 782
Herkunft: Österreich

beantworten | zitieren | melden

Naja, hast du das auch ausprobiert? Die Spaltenangabe funktioniert bei "GROUP BY" nicht, das "Cluster" kannst du bei Order By verwenden.
lg Lion
private Nachricht | Beiträge des Benutzers
IUndisposable
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers