2017-09-01 1 views
1

Ich habe eine Tabelle (Anmerkung: importiert aus Excel von Mitarbeitern verwendet werden) in Access, das so etwas wie diese enthält:Access SQL Kombinieren mehrerer Spalten und Summieren einer anderen Spalte Verschwenkung über kombinierte Spalte

Associate | Date_Of_First_Call | Date_of_Second_Call | Date_of_Third_Call 
Amy  | 07/18/2017   | 07/19/2017   | 07/20/2017 
Brian  | 07/18/2017   | 07/18/2017   | 07/20/2017 
Amy  | 07/18/2017   | 07/20/2017   | 
Carl  | 07/19/2017   | 07/20/2017   | 07/21/2017 

Ich bin sehr neu zu SQL und von dem, was ich bisher gelernt ...

SELECT Date_Of_First_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_First_Call 
UNION 
SELECT Date_Of_Second_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_Second_Call 
UNION 
SELECT Date_Of_Third_Call AS CallDate, 
SUM(IIF(Associate ="Amy", 1, 0)) AS Amy, 
SUM(IIF(Associate= "Brian", 1, 0)) AS Brian, 
SUM(IIF(Associate="Carl", 1, 0)) AS Carl, 
FROM table_name 
GROUP BY Date_Of_Third_Call 

Gibt mir:

Call Date | Amy | Brian | Carl 
07/18/2017 | 2 | 1  | 
07/18/2017 |  | 1  | 
07/19/2017 |  |  | 1 
07/19/2017 | 1 |  | 
07/20/2017 | 1 |  | 1 
07/20/2017 | 1 | 1  | 
07/21/2017 |  |  | 1 

Schließen! Aber ich mag dies unten statt:

Call Date | Amy | Brian | Carl 
07/18/2017 | 2 | 2  | 
07/19/2017 | 1 |  | 1 
07/20/2017 | 2 |1  | 1 
07/21/2017 |  |  | 1 

Zur Info: ich oben zur Folge bekommen konnte, wenn ich drei erstellt getrennte Transform/Pivot-Abfragen und unioning sie in eine, aber das erfordert insgesamt vier Abfragen. Also, wenn es einen Weg gibt, es in nur einem zu tun, das großartig wäre! Vielen Dank!

+1

sollten Sie wirklich in die Datenbank Normalisierung lesen. Es ist eine wirklich schlechte Praxis, im Wesentlichen ähnliche Informationen in verschiedenen Spalten in den Tabellen zu speichern. –

+0

Vielen Dank für Ihren Kommentar Erik. Die einzige gemeinsame Information mit diesen drei Spalten ist jedoch, dass sie vom Typ Datum sind. Jede Spalte bezeichnet das Datum, an dem ein Mitarbeiter jemanden anruft und ihnen drei Möglichkeiten gegeben werden, jemanden zu erreichen: 1) Anruf des ersten Datums, 2) Anruf des zweiten Datums und 3) Anruf des dritten Datums. – Mika

+0

Sie alle verweisen auf Anrufe, nicht wahr? Die Tatsache, dass Sie sie summieren möchten, bedeutet, dass sie verwandt sind. Die meisten UNION-Abfragen sind ein Indikator für nicht normalisierte Daten. Und deswegen geraten Sie in Schwierigkeiten. Wenn Sie dies normalisiert speichern würden, würde die Operation weniger Schritte erfordern, wie ich gerade demonstrieren werde. Wenn Sie eine Operation an den Anrufdaten ausführen möchten (z. B. eine Korrektur für eine bestimmte Zeitzone), müssen Sie sie wahrscheinlich auf alle diese Spalten anwenden, während Sie sie nur auf eine anwenden sollten. Richtig normalisiert würde die Beschränkung von maximal 3 Anrufen aufgehoben werden. –

Antwort

1

Zuerst werden wir die Daten normalisieren, diese Abfrage wird später als Unterabfrage verwendet werden:

SELECT Associate, date_of_first_call as CallDate 
FROM table_name 
UNION ALL 
SELECT Associate, date_of_second_call as CallDate 
FROM table_name 
UNION ALL 
SELECT Associate, date_of_third_call as CallDate 
FROM table_name 

Dies ist die normierte Weise Daten in einer Tabelle zu speichern (Sie eine Nummer enthalten kann Referenz, wenn es der erste, zweite oder dritte Anruf ist).

Jetzt Kreuztabellen- ist, lassen:

TRANSFORM Count(A.CallDate) AS CountOfCallDate 
SELECT A.CallDate 
FROM (
    SELECT Associate, date_of_first_call as CallDate 
    FROM table_name 
    UNION ALL 
    SELECT Associate, date_of_second_call as CallDate 
    FROM table_name 
    UNION ALL 
    SELECT Associate, date_of_third_call as CallDate 
    FROM table_name 
) As A 
GROUP BY A.CallDate 
PIVOT A.Associate 
+0

Vielen Dank für Ihre Hilfe! Es funktioniert perfekt! Und jetzt verstehe ich etwas Normalisierung. Auch FYI, ich habe "A.CountOfCallDate" in "CountOfCallDate" geändert, aufgrund eines Syntaxfehlers in der TRANSFORMATION-Anweisung. – Mika

+0

Ah, ja, tut mir leid, ich werde die Antwort bearbeiten. –

Verwandte Themen