2011-10-31 20 views
5

Por lo general, puedo averiguar cualquier consulta sql que necesito para mis aplicaciones, pero recientemente he quedado perplejo por una consulta cruzada que necesito crear y me preguntaba si podría ayudarme.SQL Server 2008 consulta de tabla cruzada

que tienen 3 mesas

Category(catID, catTitle) 
Equipment(equipID, make, model, quantity, catID, siteID) 
Site(siteID, title) 

y me gustaría crear una consulta Cruz Tab para mostrar un conjunto de resultados, como a continuación

Category Site1 Site2 Site3 Site4 Site5 
PC   2  0  10  3  6 
Camera  12  4  2  0  8 
Printer  3  2  1  1  2 

Los números mostrados representan un total de cada elemento de la categoría dentro de cada sitio usando el campo de cantidad dentro de la tabla de Equipo. Nunca antes tuve que hacer una consulta cruzada y estoy luchando para que esto funcione.

Respuesta

7

Debería poder hacer esto con el operador 'pivote'. Algo como esto (aunque estoy seguro de que desperdiciado algunas de ortografía o de sintaxis detalles ...):

select catTitle, [1] as site1, [2] as site2, [3] as site3, [4] as site4, [5] as site5 
    from (select category.catTitle, equipment.quantity, site.title 
      from equipment 
      inner join site 
       on (equipment.siteid = site.siteid) 
      inner join category 
       on (category.catid = equipment.catid) 
     ) 
    pivot 
    (
    sum (quantity) 
    for equipment.siteid in ([1], [2], [3], [4], [5]) 
) as pvt 
order by pvt.category; 

El problema con esto es que lo que necesita saber el conjunto exacto de los identificadores de sitio que desea incluir en la consulta . Si necesita una tabla cruzada más dinámica (como la que puede obtener en Excel), debe generar el texto de la consulta como una cadena y usar sp_executesql para ejecutarlo. En el texto generado, incluye tantos de "[1], [2], [3], [4], [5] ..." y "[1] como sitio1, [2] como sitio2 ... . "cosas que necesitas".

+0

Esto es super Ray. Muchas gracias por tu ayuda. – tgriffiths

2

Creo que su falta una tabla que hacer una referencia entre su sitio y el equipo

Algo así:

EquipmentSite(SiteID, EquipID) 

porque ahora es imposible decir sitio wich como equipo wich

EDITAR :

Dado que el ID de sitio también está en el equipo propongo otra tabla, un pequeño refactor de tu base de datos (porque realmente no sé cómo hacerlo)

Si obtiene muchos datos, sería un desastre buscar los datos y calcular cada cosa cada vez que quiera acceder a esos datos.

Por lo tanto, propongo esta tabla

siteCatCount(CatID, siteID, cnt) 

Así que cuando modifique sus datos (agregar o quitar equipos) va a ir actualizar esta tabla, sería mucho más claro y usted no tendrá que calcular el recuento de cada equipo cada vez

+0

Mis disculpas. Eso fue un error tipográfico, la tabla de Equipo también tiene un campo ID de sitio. – tgriffiths

+0

Sí, incluso con el siteID es un desastre :) – GregM