2017-02-21 2 views
1

Ich habe diese Tabelle „Letter_Senders“:Zählen Vorkommnisse zwischen beiden Seiten auf SQL

> LETTER_ID | SENDER | RECIPIENT 
> 123  | John | David 
> 234  | Josh | Andrew 
> 345  | David | John 
> 456  | Matt | David 
> 567  | David | Matt 
> 678  | John | David 

Ich würde wirklich die Hilfe zum Aufsummieren der Anzahl der Buchstaben zu schätzen wissen, die zwischen jedem Paar von Völkern wie in der geschickt wurden folgende „Counting_Letters“ Tabelle:

Person_1 | Person_2 | Num_Of_Letters 
John  | David | 3 
Josh  | Andrew | 1 
Matt  | David | 2 

versuchte, es herauszufinden, aber habe keine Ahnung, müssen in Betracht ziehen nur einmal von beiden Seiten Person zu zählen.

+5

bitte die dbms markieren, die Sie verwenden. –

Antwort

2

Wenn Ihr dbms unterstützt Funktionen wie greatest und least kann

SELECT greatest(person_1,person_2) AS person_1, 
     least(person_1,person_2) AS person_2, 
     count(*) AS num_letters 
FROM letter_senders 
GROUP BY greatest(person_1,person_2), 
     least(person_1,person_2) 

verwenden Sie auch mit einem case Ausdruck erreicht werden.

SELECT CASE 
      WHEN person_1>person_2 THEN person_1 
      ELSE person_2 
     END AS person_1, 
     CASE 
      WHEN person_1<person_2 THEN person_1 
      ELSE person_2 
     END AS person_2, 
     count(*) AS num_letters 
FROM letter_senders 
GROUP BY CASE 
      WHEN person_1>person_2 THEN person_1 
      ELSE person_2 
     END, 
     CASE 
      WHEN person_1<person_2 THEN person_1 
      ELSE person_2 
     END 
+0

Arbeit wie Charme, danke, viel gelernt! – Rekel

1

Ich kam mit der gleichen Antwort wie vkp oben (unter den gleichen Annahmen arbeiten):

IF OBJECT_ID('tempdb..#Test') IS NOT NULL 
    DROP TABLE #Test 

CREATE TABLE #Test 
(
    LETTER_ID INT 
    ,SENDER VARCHAR(20) 
    ,RECIPIENT VARCHAR(20) 
) 

INSERT #Test 
VALUES 
(123, 'John', 'David'), 
(234, 'Josh', 'Andrew'), 
(345, 'David', 'John'), 
(456, 'Matt', 'David'), 
(567, 'David', 'Matt'), 
(678, 'John', 'David') 

SELECT 
CASE 
    WHEN SENDER < RECIPIENT 
     THEN SENDER 
    ELSE RECIPIENT 
END [Person_1] 
,CASE 
    WHEN SENDER > RECIPIENT 
     THEN SENDER 
    ELSE RECIPIENT 
END [Person_2] 
,COUNT(*) [Num_Of_Leters] 
FROM #Test 
GROUP BY CASE 
    WHEN SENDER < RECIPIENT 
     THEN SENDER 
    ELSE RECIPIENT 
END 
,CASE 
    WHEN SENDER > RECIPIENT 
     THEN SENDER 
    ELSE RECIPIENT 
END 
+0

Ähnlich wie das, was ich gepostet hätte, außer dass ich die Gruppen mit einer CTE berechnet hätte und dann eine Gruppe dran vorbei gemacht hätte. Ich persönlich finde es einfach leichter zu lesen. – KeithL

0
WITH 
    letters (sender, recipient, num_of_letters) AS 
    (
     SELECT 
      sender 
      , recipient 
      , COUNT(*) num_of_letters 
     FROM 
      letter_senders 
     GROUP BY 
      sender 
      , recipient 
    ) 
SELECT 
    person_1   sent.sender 
    , person_2   sent.recipient 
    , num_of_letters sent.num_of_letters + received.num_of_letters 
FROM  letters_sent sent 
INNER JOIN letters_sent received 
ON 
    (sent.sender = received.sender AND sent.recipient = received.recipient) 
    OR (sent.recipient = received.sender AND sent.sender = received.recipient) 
Verwandte Themen