Denken an es auf diese Weise, versuchen Sie die Tabelle mit sich selbst durch col2 zu beziehen, so dass wir mit einem Join auf sich selbst beginnen:
select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */
Jetzt für Ihr Aggregat. Sie wollen alle right.col1 aggregieren die Zählung für diese Spalte zu erhalten:
select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2
die ich glaube, mit den Rohzählungen kommen sollte. Ich glaube, du musst die Abfrage drehen und eine Summe erhalten, um die Häufigkeit zu erhalten.
Als eine Anmerkung, das wäre viel komplizierter, wenn col1 nicht konstant wäre.
Edited zu hinzufügen: Wenn Sie für eine Abfrage suchen, anstatt über sie Laufen in welcher Sprache auch immer Sie von Abfragen sind, müssen Sie diese zweimal Gruppierung tun:
SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq/totals.total
FROM (SELECT
left.col1 AS col1,
COUNT(*) AS total
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY left.col1
) totals
INNER JOIN (SELECT
left.col1 AS col1,
right.col1 AS col2,
COUNT(*) AS freq
FROM TABLE LEFT
INNER JOIN TABLE RIGHT
ON left.col2 = right.col2
WHERE left.col1 = '2001'
GROUP BY right.col2
) abs_freq
ON abs_freq.col1 = totals.col1
Das macht keinen Sinn Kannst du die Frage neu formulieren? –
Sind Ihre col2 Daten im ersten Block korrekt? – northpole
Die Beispieldaten und gewünschten Ergebnisse machen keinen Sinn - 2001 kommt im Beispiel doppelt in col1 vor, die entsprechenden col2-Werte sind jeweils 3001 und 3003 - keine Beziehung zur gewünschten Ausgabe. –