I have a function that gets a SQL code and inserts a count field in it and executes the query to return the number of rows in it. The objective is to have a dynamic SQL code and be able to get its record count no matter what code it has, because I use it in a registry filter window and I never know what code may be generated, because the user can add as many filters as he/she wants.

But as I use the group by clause, the result is wrong because it is counting the number of times a main registry appears because of the use on many join connections.

The result of that code above should only one row with a columns with 10 as result, but I get a new table with the first columns with a 2 in the first row and a 1 on the other rows.

If I take off the group by clause I will receive a 11 as a count result, but the first row will be counted twice.

What should I do to get a single row and the correct number?

SELECT 
 COUNT(*) QUERYRECORDCOUNT, // this line appears only in the Count() function 
 ARTISTA.*,
 CATEGORIA.NOME AS CATEGORIA,
 ATIVIDADE.NOME AS ATIVIDADE,
 LOCALIDADE.NOME AS CIDADE,
 MATRICULA.NUMERO AS MAP

FROM
 ARTISTA
 LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
 LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
 LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
 LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
 LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID

WHERE 
 ((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
GROUP BY
 ARTISTA.ARTISTA_ID
ORDER BY 
 ARTISTA.ARTISTA_ID;
有帮助吗?

解决方案

This always gives you the number of rows for any query you have:

Select count(*) as rowcount from
(

     Paste your query here

) as countquery

其他提示

Since your are GROUPING BY ARTISTA.ARTISTA_ID, COUNT(*) QUERYRECORDCOUNT will return records count for each ARTISTA.ARTISTA_ID value.

If you want GLOBAL count, then you need to use a nested query:

SELECT COUNT(*) AS QUERYRECORDCOUNT 
    FROM (SELECT 
     ARTISTA.*,
     CATEGORIA.NOME AS CATEGORIA,
     ATIVIDADE.NOME AS ATIVIDADE,
     LOCALIDADE.NOME AS CIDADE,
     MATRICULA.NUMERO AS MAP

    FROM
     ARTISTA
     LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
     LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
     LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
     LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
     LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID

    WHERE 
     ((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
    GROUP BY
     ARTISTA.ARTISTA_ID
    ORDER BY 
     ARTISTA.ARTISTA_ID);

In this case, you may not need to select those many columns.

If you need to retrieve the all records count with details, then better to use two separate queries.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top