Pregunta

Soy nuevo en SQL Server Reporting Services y me preguntaba cuál es la mejor manera de hacer lo siguiente:

  • Consulta para obtener una lista de ID populares
  • Subconsulta sobre cada elemento para obtener propiedades de otra tabla

Idealmente, las columnas del informe final tendrían este aspecto:

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

Puede haber formas de construir una consulta SQL gigante para hacer todo esto de una sola vez, pero preferiría compartimentarla.¿El enfoque recomendado es escribir una función VB para realizar la subconsulta para cada fila?Gracias por cualquier ayuda.

¿Fue útil?

Solución

Yo recomendaría usar un Subinforme.Colocaría el subinforme en una celda de la tabla.

Otros consejos

Dependiendo de cómo desee que se vea el resultado, podría ser suficiente un subinforme, o podría agrupar por ID, propiedad1, propiedad2 y mostrar los elementos de su otra tabla como elementos detallados (suponiendo que desee mostrar más que solo el recuento).

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 Creo que encontrará que una combinación externa tiene mejor rendimiento que la subconsulta correlacionada en el ejemplo que dio.Recuerde que la subconsulta debe ejecutarse para cada fila.

El método más simple es este:

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

aquí hay una versión viable (usando variables de tabla):

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, esto es solo un ejemplo sencillo: se aplican reglas estándar como no seleccionar *, etc.


ACTUALIZACIÓN del 21 de agosto de 2008 a las 21:27:
@AlexCuse: Sí, totalmente de acuerdo con la actuación.

Comencé a escribirlo con la unión externa, pero luego vi en su muestra el resultado del recuento y pensé que eso era lo que quería, y que el recuento no volvería correctamente si las tablas estaban unidas externamente.Sin mencionar que las uniones pueden hacer que sus registros se multipliquen (1 entrada de tbl1 que coincide con 2 entradas en tbl2 = 2 devoluciones), lo que puede no ser intencionado.

Así que supongo que todo se reduce a los detalles de lo que su consulta debe devolver.


ACTUALIZACIÓN del 21 de agosto de 2008 a las 22:07:
Para responder a las otras partes de su pregunta: ¿es una función VB el camino a seguir?No.Absolutamente no.No por algo tan simple.

Las funciones tienen muy mal rendimiento, cada fila del conjunto de retorno ejecuta la función.

Si desea "compartimentar" las diferentes partes de la consulta, debe abordarla más como un procedimiento almacenado.Cree una tabla temporal, realice parte de la consulta e inserte los resultados en la tabla, luego realice las consultas adicionales que necesite y actualice la tabla temporal original (o insértela en más tablas temporales).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top