2016-04-02 16 views
1

Siehe unten für 1. bearbeiten im Anschluss an die Antwort von @Gordon LinoffTypen abrufen Artikel, deren Subtyp, und zählt dieser Typen und Subtypen

Boden Siehe 2. edit/unordentlich Lösung

Original Frage

Ich habe 3 Tabellen;

tblOrganisations 
tblOrganisationTypes 
tblOrganisationSubTypes 

Eine Organisation kann einen Typ haben, und einige Typen eine Unterart

Ich versuche, eine Liste und Anzahl der Typen und Subtypen zu bekommen, aber ich habe Probleme mit der Zählung haben kann, wo Ein Typ hat einen Untertyp.

Die folgende Abfrage und Code;

<CFQUERY NAME="RetrieveAllOrganisationTypes" DATASOURCE="#strDev#"> 
    SELECT tblOrganisations.tblOrganisationTypes_ReferenceID , COUNT(tblOrganisations.tblOrganisationTypes_ReferenceID) AS TypeCount , COUNT(tblOrganisations.tblOrganisationSubTypes_ReferenceID) AS SubTypeCount , tblOrganisationTypes.OrganisationType , tblOrganisationSubTypes.OrganisationSubType 
      FROM ((tblOrganisations 
      LEFT JOIN tblOrganisationTypes ON tblOrganisations.tblOrganisationTypes_ReferenceID = tblOrganisationTypes.ReferenceID) 
      LEFT JOIN tblOrganisationSubTypes ON tblOrganisations.tblOrganisationSubTypes_ReferenceID = tblOrganisationSubTypes.ReferenceID) 
      GROUP BY tblOrganisations.tblOrganisationTypes_ReferenceID , tblOrganisations.tblOrganisationSubTypes_ReferenceID 
      ORDER BY tblOrganisationTypes.OrganisationType , tblOrganisationSubTypes.OrganisationSubType 
</CFQUERY> 

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType"> 
    #OrganisationType# (#TypeCount#)<BR> 
    <CFIF OrganisationSubType IS NOT ""><CFOUTPUT GROUP="OrganisationSubType">-- #OrganisationSubType# (#SubTypeCount#)<BR></CFOUTPUT></CFIF> 
</CFOUTPUT> 

Ruft mich das;

AFFILIATED (2) 
ASSOCIATE (15) 
FULL (10) 
-- operator (10) 
-- manufacturer (4) 
-- owner (108) 
-- survey company (4) 
-- supplier (4) 
GOVERNMENT (5) 
MISCELLANEOUS (3) 
SCIENCE (4) 

Aber sehen Sie, die volle Zahl - 10 - falsch ist. Es sollte 130 sein! Für Typen ohne SubType ist die Anzahl korrekt. Die Anzahl der SubTypes ist korrekt. Ich habe alle Arten versucht, aber ich bin nicht immer überall :(

Jede Hilfe wird sehr geschätzt! :)

1. bearbeiten

Nach der Hilfe von @Gordon Linoff und fügte hinzu, die WITH ROLLUP, Entfernen der ORDER BY und mit dem folgenden Code;

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType"> 
    #OrganisationType# (#TypeCount#) #SubTypeCount#<BR> 
    <CFIF OrganisationSubType IS NOT ""><CFOUTPUT GROUP="OrganisationSubType">-- #OrganisationSubType# (#TypeCount#) #SubTypeCount#<BR></CFOUTPUT></CFIF> 
</CFOUTPUT> 

Ich bekomme jetzt;

AFFILIATED (2) 2 
ASSOCIATE (15) 15 
FULL (10) 10 
-- operator (10) 10 
-- manufacturer (4) 4 
-- owner (108) 108 
-- survey company (4) 4 
-- supplier (4) 4 
-- (130) 130 
GOVERNMENT (5) 5 
MISCELLANEOUS (3) 3 
SCIENCE (4) 4 
(159) 159 

Sie sehen also, ich bin die 130 bekommen, aber wie bekomme ich die 130 vom FULL ?!

2. edit/unordentlich Lösung

Also ich denke, das ist ein bisschen chaotisch Lösung, aber es funktioniert!

Der folgende Ausgabecode;

<CFOUTPUT QUERY="RetrieveAllOrganisationTypes" GROUP="OrganisationType"> 
    <CFOUTPUT GROUP="OrganisationSubType"> 
    <CFIF OrganisationSubType IS "" AND OrganisationType IS NOT "">#OrganisationType# (#TypeCount#)<BR></CFIF> 
    </CFOUTPUT> 
    <CFOUTPUT GROUP="OrganisationSubType"> 
    <CFIF OrganisationSubType IS NOT "" AND OrganisationType IS NOT "">--#OrganisationSubType# (#SubTypeCount#)<BR></CFIF> 
    </CFOUTPUT> 
</CFOUTPUT> 

Gibt mir;

AFFILIATED (2) 
ASSOCIATE (15) 
FULL (130) 
--operator (10) 
--manufacturer (4) 
--owner (108) 
--survey company (4) 
--supplier (4) 
GOVERNMENT (5) 
MISCELLANEOUS (3) 
SCIENCE (4) 

Ich bin sicher, es ist wahrscheinlich ein sauberer Weg, dies zu tun, und wenn jemand es weiß, ich bin offen für Vorschläge, aber jetzt - das funktioniert :)

Antwort

2

Das ist Ihre Abfrage mit Tabelle Aliase, so dass es ein bisschen leichter zu lesen ist:

SELECT o.tblOrganisationTypes_ReferenceID ,  
     COUNT(o.tblOrganisationTypes_ReferenceID) AS TypeCount , 
     COUNT(o.tblOrganisationSubTypes_ReferenceID) AS SubTypeCount , 
     ot.OrganisationType , ost.OrganisationSubType 
FROM tblOrganisations o LEFT JOIN 
    tblOrganisationTypes ot 
    ON o.tblOrganisationTypes_ReferenceID = ot.ReferenceID LEFT JOIN 
    tblOrganisationSubTypes ost 
    ON o.tblOrganisationSubTypes_ReferenceID = ost.ReferenceID) 
GROUP BY o.tblOrganisationTypes_ReferenceID, 
     o.tblOrganisationSubTypes_ReferenceID 
ORDER BY ot.OrganisationType , ost.OrganisationSubType; 

Sie sind verwirrt. Die "10", die Sie erhalten, ist die Anzahl der Organisationen mit FULL, die keine Subtypen haben. Es ist keine Art von Aggregation.Wenn Sie Summen auf verschiedenen Ebenen, dann ist ein guter Ansatz verwendet ROLLUP:

GROUP BY o.tblOrganisationTypes_ReferenceID, 
     o.tblOrganisationSubTypes_ReferenceID WITH ROLLUP 

Diese zusätzliche Zeilen für alle möglich Teilsummen produzieren wird (darunter insgesamt für die gesamte Tabelle). Sie müssen herausfinden, wie die resultierenden Zeilen gefiltert werden, um zu erhalten, was Sie wollen. Sie sollten die documentation für diese Funktion überprüfen.

+0

danke für deine hilfe, ich hätte noch nie von WITH ROLLUP gehört - also werde ich mich darum kümmern. Ich habe versucht, die WITH ROLLUP, aber ich habe einen Fehler - "Fehler beim Ausführen Datenbankabfrage. Falsche Verwendung von CUBE/ROLLUP und ORDER BY" aber ich fand, wenn ich die ORDER BY Zeug entfernt, funktioniert es - die Zahlen sind alle gut :) – luke

+0

ahhhh ... von diesem Link zur Dokumentation; 'Wenn Sie ROLLUP verwenden, können Sie die Ergebnisse auch nicht mit einer ORDER BY-Klausel sortieren. Mit anderen Worten, ROLLUP und ORDER BY schließen sich gegenseitig aus. " – luke

+0

sorry ich war falsch :(die Zählung nicht korrekt ist - ich erhalte; ASSOCIATE (15) FULL (108) - Inhaber (108) - Operator (10) - Hersteller (4) - Systemanbieter (4) - Umfrage Unternehmen (4) REGIERUNG (5) SCIENCE (4) VERBUNDENEN (2) SONSTIGES (3) – luke