2017-03-29 2 views
0

ich eine Tabelle in Access haben, die Eigenschaft IDs auflistet und die Jahre jeweils zertifiziert wurden:Verkettungs in zwischen Datensätzen in Access-Abfrage

B_ID CertYear 
a 2016 
b 2016 
c 2015 
a 2015 
a 2014 

Ich möchte eine Abfrage/Tabelle erstellen, die die Anzahl der Jahre zählen wird je Gebäude wurde zertifiziert und auch jedes Jahr in separaten Spalten Liste wie folgt aussehen:

B_ID Count_CertYear Detail_CertYear 
a 3 2016|2015|2014 
b 1 2016 
c 1 2015 

im Abfrageentwurf konnte ich die ersten beiden Spalten berechnen, aber ich bin nicht in der Lage, herauszufinden, wie die dritte zu tun. Hier ist, wie ich derzeit den Tisch ausgebreitet habe.

Field: B_ID B_ID 
Table: MyTable MyTable 
Total: Count Count 
Sort:  
Show:  
Criteria:  
Or:  

Antwort

0

Zugang mit einer Reihe von Domain-Aggregationsfunktionen kommen wird, Count(), Sum(), Avg(), First(), Last(), Min(), Max(), StDev(), StDevP(), Var() und VarP(), jedoch gibt es keine systemeigene Domänenverkettungsfunktion.

Meine Präferenz wäre, dies in SQL Server zu behandeln und die Ergebnisse über gespeicherte Prozedur zurückgeben, aber wenn Sie auf Access beschränkt sind, dann ist die Verwendung von Patrick Matthews Domänenverkettungsfunktion here Ihre beste Wette.

Aus der Dokumentation von DConcat():

SELECT DConcat("Account","Sample") AS Accounts 
FROM Sample 
GROUP BY DConcat("Account","Sample"); 

Returns: 
Accounts 
----------------------------------------------------------------------------- 
Acct1, Acct10, Acct2, Acct3, Acct4, Acct5, Acct6, Acct7, Acct8, Acct9 

Für das spezielle Beispiel in Frage:

SELECT B_ID 
    , COUNT(Cert_Year) 
    , DConcat("CertYear","MyTable", "B_ID='" & [B_ID] & "'") AS Detail_CertYear 
FROM MyTable 
GROUP BY B_ID 

Sollten diese Werte zurück:

B_ID Count_CertYear Detail_CertYear 
------------------------------ 
a 3    2016,2015,2014 
b 1    2016 
c 1    2015 
+0

die Funktion Dconcat nicht von Access in SQL-Ansicht von Abfrageentwurf oder Expression Builder erkannt. Irgendwelche Alternative? – Danny

0

Um dies zu tun, in Zugriff können Sie entweder eine Kreuztabellenabfrage verwenden oder eine Funktion verwenden, um die Jahre basierend auf B_ID zu verketten.

Sie sagen, dass Sie "jedes Jahr in separaten Spalten auflisten" möchten, also denke ich, dass die Kreuztabelle für Sie hier besser geeignet ist. Hier

ist die Kreuztabellen- SQL:

TRANSFORM Min(t.[CertYear]) AS MinOfCertYear 
SELECT t.[B_ID], Count(t.[CertYear]) AS [TotalYears] 
FROM (
    SELECT 
    t1.B_ID, 
    t1.CertYear, 
    COUNT(t2.ID) AS YearCount 
    FROM YourTable t1 
    INNER JOIN YourTable t2 
      ON t1.B_ID = t2.B_ID 
     AND t1.ID <= t2.ID 
    GROUP BY t1.B_ID, t1.CertYear 
) t 
GROUP BY t.[B_ID] 
PIVOT 'Year: ' & t.[YearCount]; 

Wenn Sie wollen einfach nur die Jahre zurückkehren in ein Komma getrennt einzelne Spalte können Sie die Funktion gefunden here als Teil eines regelmäßigen Aggregatabfrage.

Dann Ihre SQL wäre:

SELECT 
    t1.B_ID, 
    COUNT(t1.ID) AS YearCount, 
    SimpleCSV("SELECT t3.CertYear FROM YourTable t3 WHERE t3.B_ID = '" & t1.B_ID & "'") AS [Years] 
FROM YourTable t1 
GROUP BY t1.B_ID 
+0

@ David Marten, ich habe das SQL im zweiten Beispiel in die SQL-Ansicht im Query Design eingefügt. Ich erhalte einen Fehler, der feststellt, dass SimpleCSV eine undefinierte Funktion ist. Außerdem stammen alle Daten in der Tabelle, die ich erstellen möchte, aus einer Tabelle. Es ist nicht klar, woher "t3" kommt. Kannst du bitte etwas ausarbeiten? – Danny

+0

SimpleCSV() ist eine benutzerdefinierte VBA-Funktion in dem Link, den ich in meiner Antwort gepostet habe. Speichern Sie es in einem neuen Standard-VBA-Modul (benennen Sie das Modul anders als 'SimpleCSV'). Kompilieren Sie den Code (Debug-Menü im VBA-Editor -> Kompilieren) T3 ist nur ein Alias ​​- Die Funktion funktioniert durch Öffnen eines separaten Recordset für jeden Datensatz in der Aggregatabfrage und Verketten der Datensätze mit der gleichen B_ID. Ich wollte mit Ihnen überprüfen, dass Ihr Tisch ein Primärschlüsselfeld hat? Stellen Sie außerdem sicher, dass Sie die Vorkommen von 'YourTable' durch Ihren tatsächlichen Tabellennamen ersetzen. –

Verwandte Themen