2010-12-02 2 views
0

abrufen Ich habe eine LIST (Abfrageausgabe), die die eindeutigen IDs aus einer Tabelle "Konto" hat. Mit dieser LIST Ich LOOPING über eine SELECT-Abfrage und im Grunde einige COUNT extrahieren. Ich habe Probleme, den COUNT-Wert auf individueller Basis zu erhalten.Konnte die erforderliche Ausgabe nicht mit einer LIST, <cfloop> und <cfquery>

Die Tabelle „Konto“ hat die Felder 1) contract_ID,
2) vAccountID (Primärschlüssel) und 3) status_id (Werte =‘‘, V, C).

ich die folgende Abfrage

<cfquery name="qryGetid" datasource="#datasource#"> 
SELECT DISTINCT(contract_ID) 
FROM Account 
    ORDER BY contract_ID DESC 
</cfquery> 


<!--- account details for each ---> 
<cfset Z =#ValueList(qryGetid.ID)# > 
<cfloop list="#Z#" index="Y" > 
<cfquery name="qryGetNiceAccounts" datasource="#dataSource#"> 
SELECT 
DISTINCT(a.contract_ID) 
,(SELECT count(vAccountID) FROM Account 
     WHERE c _ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator=",">) 
     AND Status_id = 'V') AS Valid_AcntV 
,(SELECT count(vAccountID) FROM Account 
     WHERE c _ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator=",">) 
     AND Status_id = 'C') AS Valid_AcntC 

    FROM Account a 
    WHERE 
a.contract_ID IN (<cfqueryparam value="#x#" list="yes" cfsqltype="cf_sql_integer" separator="," >) 
ORDER BY contract_ID DESC 

</cfquery> 

Die Abfrage tue = „qryGetNiceAccounts“ kehrt nur ein Wert für „Valid_AcntCount“ sogar für verschiedene „C_Id“ in der Liste.

Beispiel, wenn das „Konto“ Tabelle die Werte hat

contract_ID  count(vID)/ v_Accoun t=’v’  count(vID)/ v_Accoun t=’c’ 

    123   10             220 
    124   05             110 
    123   01              0 

contract_ID count(vID)/ v_Accoun t=’v’  count(vID)/ v_Accoun t=’c’ 
    123   10             220 
    124   10             220 
    123   10             220 

Grundsätzlich Ich habe Probleme ZÄHLT für einzelne IDs zu bekommen.

Randbemerkung: -Wenn ich einen Dump der Input „contract_ID“ als 123 zeigt, 123 123 statt 123.124.125

+1

Wenn Sie ein tun, was sehen Sie? – charliegriefer

+1

Randnotiz: Warum schleifen Sie über eine 'ValueList()' aus einer Abfrage, wenn Sie nur die Abfrage selbst durchlaufen können? – Tomalak

Antwort

2

[...] Mit dieser LIST Ich LOOPING über eine SELECT-Abfrage und im Grunde einige COUNT extrahieren. [...]

Dies ist im Allgemeinen eine schlechte Idee. Besonders "einige Zahlen zu erhalten" ist eine der einfachsten Aufgaben, die direkt in SQL ausgeführt werden können. In den meisten Fällen gibt es keinen Grund, eine SELECT-Abfrage in einer Schleife auszuführen. Vermeiden Sie dies aus Leistungsgründen, wann immer Sie können.

Und es ist in Ihrem Fall perfekt vermeidbar (es macht auch viel einfacher Code), um nur Ihre SQL ändern:

<cfquery name="qryGetNiceAccounts" datasource="#dataSource#"> 
    SELECT 
    contract_ID, 
    (SELECT COUNT(vAccountID) FROM v_Account 
     WHERE c_ID = a.contract_ID AND Status_id = 'V' 
    ) AS Valid_AcntV, 
    (SELECT COUNT(vAccountID) FROM v_Account 
     WHERE c_ID = a.contract_ID AND Status_id = 'C' 
    ) AS Valid_AcntC 
    FROM 
    (SELECT contract_ID FROM Account GROUP BY contract_ID) AS a 
    ORDER BY 
    contract_ID DESC 
</cfquery> 

Sie müssen überhaupt nicht über die andere Abfrage, weder benötigen Sie das Schleife.

Eine alternative Möglichkeit, das gleiche wäre dies auszudrücken:

SELECT 
    a.contract_ID, 
    SUM(CASE Status_id WHEN 'V' THEN 1 ELSE 0 END) AS Valid_AcntV, 
    SUM(CASE Status_id WHEN 'C' THEN 1 ELSE 0 END) AS Valid_AcntC 
FROM 
    Account AS a 
    INNER JOIN v_Account AS c ON c.c_id = a.contract_ID 
GROUP BY 
    a.contract_ID 
ORDER BY 
    a.contract_ID DESC 

Diese nur einmal v_Account Ansicht treffen würde. Sie müssen selbst bestimmen, was die effizienteste Abfrage ist.

4

Ich glaube, du bist es overcomplicating, und es kann mit einer einzigen Abfrage gelöst werden ein paar Joins:

Sollte tun, wonach Sie suchen, wenn ich Ihre Abfragen richtig entschlüsseln.

+1

+1 Das ist die Alternative zu meiner Gruppe zuerst/Auswahl zählt später Ansatz. – Tomalak

+0

Danke! aber ich möchte erwähnen, dass ich die Tabelle "v_Account" IN ... "LINKEN VERBINDUNG v_Account AS vav .." zu "Account" geändert habe. – Fransis

+0

Im Grunde innere Join auf sich selbst Dies verlangsamt die Abfrage sehr. – Fransis

Verwandte Themen