Pergunta

Sou novo no SQL Server Reporting Services e queria saber a melhor maneira de fazer o seguinte:

  • Consulta para obter uma lista de IDs populares
  • Subconsulta em cada item para obter propriedades de outra tabela

Idealmente, as colunas do relatório final seriam assim:

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

Pode haver maneiras de construir uma consulta SQL gigante para fazer tudo isso de uma só vez, mas prefiro compartimentá-la.A abordagem recomendada é escrever uma função VB para executar a subconsulta para cada linha?Obrigado por qualquer ajuda.

Foi útil?

Solução

Eu recomendaria usar um Sub-relatório.Você colocaria o SubReport em uma célula da tabela.

Outras dicas

Dependendo de como você deseja a aparência da saída, um sub-relatório pode servir, ou você pode agrupar em ID, propriedade1, propriedade2 e mostrar os itens de sua outra tabela como itens de detalhes (supondo que você queira mostrar mais do que apenas contar).

Algo como

select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID

@Carlton Jenke Acho que você descobrirá que uma junção externa tem melhor desempenho do que a subconsulta correlacionada no exemplo que você deu.Lembre-se de que a subconsulta precisa ser executada para cada linha.

O método mais simples é este:

select *,
 (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1

aqui está uma versão viável (usando variáveis ​​de tabela):

declare @tbl1 table
(
 tbl1ID int,
 prop1 varchar(1),
 prop2 varchar(2)
)

declare @tbl2 table
(
 tbl2ID int,
 tbl1ID int
)

select *,
 (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1

Obviamente, este é apenas um exemplo bruto - aplicam-se regras padrão como não selecionar *, etc ...


ATUALIZAÇÃO de 21 de agosto de 2008 às 21h27:
@AlexCuse - Sim, concordo totalmente com o desempenho.

Comecei a escrevê-lo com a junção externa, mas depois vi na saída de amostra dele a contagem e pensei que era isso que ele queria, e a contagem não retornaria corretamente se as tabelas fossem unidas externamente.Sem falar que as junções podem fazer com que seus registros sejam multiplicados (1 entrada de tbl1 que corresponde a 2 entradas em tbl2 = 2 retornos) o que pode ser involuntário.

Então, acho que tudo se resume aos detalhes sobre o que sua consulta precisa retornar.


ATUALIZAÇÃO de 21 de agosto de 2008 às 22h07:
Para responder às outras partes da sua pergunta - uma função VB é o caminho a seguir?Não.Absolutamente não.Não por algo tão simples.

As funções têm desempenho muito ruim, cada linha no conjunto de retorno executa a função.

Se você quiser "compartimentalizar" as diferentes partes da consulta, deverá abordá-la mais como um procedimento armazenado.Crie uma tabela temporária, faça parte da consulta e insira os resultados na tabela, depois faça as consultas adicionais necessárias e atualize a tabela temporária original (ou insira em mais tabelas temporárias).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top