2017-06-28 1 views
0

SQL, eine Tabelle, zwei Spalten von Daten, person und mailbox. Jede Person kann viele Mailboxen haben, jede Mailbox kann viele Leute haben. Ich möchte die Zahl der Menschen zu anderen Menschen durch eine Mailbox verbunden bekommen:SQL erhalten Verbindungen von einer Spalte zu sich selbst durch zweite Spalte

person | mailboxCount | aggregatePersonCount 

ich ein schlechtes Gefühl haben, diese an anderer Stelle hier gelöst worden ist, aber ich kann nicht glauben, was die Terminologie sein könnte. Für all die großen, komplizierten gespeicherten Prozeduren und Abfragen, die ich geschrieben habe, stolpert mich diese einfache Zwei-Spalten-Analyse.

Tabellenstruktur:

person | mailbox 

Ich habe die ersten beiden Spalten:

SELECT a.person, count(a.mailbox) mailboxCount 
FROM [EmailGroupAnalysis].[dbo].[AnalysisTests] a 
GROUP BY a.person 
order by mailboxCount desc 
+1

Wie sind "Menschen über ihre Mailbox mit anderen Menschen verbunden" in Bezug auf Ihre Daten? Eine rekursive Lösung, die einen allgemeinen Tabellenausdruck (CTE) verwendet, kann geeignet sein. Tipp: Es ist hilfreich, Datenbankfragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. Beachten Sie, dass 'tsql' die Auswahl einschränkt, aber die Datenbank nicht angibt. – HABO

Antwort

1

Sie einen Self-Join verwenden:

select a.person, count(distinct a.mailbox) as mailboxCount, 
     count(distinct a2.person) as mailboxConnectedPersons 
from [EmailGroupAnalysis].[dbo].[AnalysisTests] a left join 
    [EmailGroupAnalysis].[dbo].[AnalysisTests] a2 
    on a.mailbox = a2.mailbox 
group by a.person 
order by mailboxCount desc; 

Hinweis: Dies zählt die ursprüngliche Person. Sie können 1 subtrahieren, um dies zu vermeiden.

Verwandte Themen