Невозможно получить требуемый вывод, используя LIST, <cfloop>и <cfquery> - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть СПИСОК (вывод запроса), который имеет отдельные идентификаторы из таблицы «Учетная запись». Используя этот список, я зацикливаюсь на запросе SELECT и в основном извлекаю немного COUNT. У меня проблемы с получением значения COUNT для каждого отдельного лица.

В таблице «Аккаунт» есть поля 1) contract_ID,
2) vAccountID (первичный ключ) и 3) Status_id (значения = ’’, V, C).

Я делаю следующий запрос

    <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>

query = "qryGetNiceAccounts" возвращает только одно значение для Valid_AcntCount, даже для разных «c_ID» в списке.

Пример, если в таблице «Account» есть значения

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

В основном у меня проблемы с получением СЧЕТОВ для отдельных идентификаторов.

Примечание: -Когда я делаю дамп, Ввод «contract_ID» отображается как 123, 123 123, а не 123,124,125

Ответы [ 2 ]

4 голосов
/ 02 декабря 2010

Я думаю, что вы слишком усложняете его, и его можно решить одним запросом с несколькими объединениями:

SELECT 
    a.contract_ID, 
    COUNT(vav.vAccountID) AS Valid_AcntV, 
    COUNT(vac.vAccountID) AS Valid_AcntC
FROM  Account a
LEFT JOIN v_Account AS vav 
    ON vav.c_ID = a.contract_ID AND vav.Status_id = 'V'
LEFT JOIN v_Account AS vac 
    ON vac.c_ID = a.contract_ID AND vac.Status_id = 'C'
GROUP BY   a.contract_ID
ORDER BY   a.contract_ID   DESC

Должен делать то, что вам нужно, если я правильно расшифрую ваши запросы.

2 голосов
/ 02 декабря 2010

[…] Используя этот LIST, я зацикливаюсь на запросе SELECT и, в основном, извлекаю немного COUNT. [...]

Это вообще плохая идея. В частности, «получение некоторого количества» - это одна из самых простых вещей, которую можно сделать непосредственно в SQL, и чаще всего нет причин выполнять запрос SELECT в цикле. Избегайте этого всякий раз, когда вы можете по соображениям производительности.

И в вашем случае этого совершенно можно избежать (это даже делает ваш код намного проще), просто измените ваш SQL:

<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>

Вам не нужен другой запрос вообще, и вам не нужен цикл.

Альтернативный способ выразить то же самое:

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

Это приведет к просмотру v_Account только один раз. Вы должны определить для себя, какой запрос наиболее эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...