2011-10-31 17 views
5

Di solito riesco a capire le query SQL necessarie per le mie applicazioni, ma di recente sono stato escluso da una query di Cross Tab che ho bisogno di creare e mi chiedevo se potevi aiutare?SQL Sql Server 2008 Cross Tab Query

Ho 3 tabelle

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

e vorrei creare una query Tab Croce per visualizzare un set di risultati come qui di seguito

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

I numeri visualizzati rappresentano un totale di ogni elemento categoria all'interno ogni sito utilizza il campo quantità senza la tabella Equipaggiamento. Non ho mai dovuto eseguire una query in Tab incrociata prima e ho difficoltà a farlo funzionare.

risposta

7

Dovresti riuscire a farlo con l'operatore 'pivot'. Qualcosa di simile (anche se sono sicuro che muffed alcuni di ortografia o di sintassi dettagli ...):

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; 

Il problema di questo è che è necessario conoscere l'esatto set di ID del sito che si desidera includere nella query . Se è necessario un campo incrociato più dinamico (come si può ottenere in Excel), è necessario generare il testo della query come stringa e utilizzare sp_executesql per eseguirlo. Nel testo generato, includi il maggior numero di "[1], [2], [3], [4], [5] ..." e "[1] come sito1, [2] come sito2 .. . "Le cose di cui hai bisogno.

+0

Questo è super Ray. Grazie mille per il vostro aiuto. – tgriffiths

2

Credo che la vostra manca una tabella che fanno riferimento tra il vostro sito e le attrezzature

Qualcosa del genere:

EquipmentSite(SiteID, EquipID) 

Perché adesso è impossibile dire sito wich come equipaggiamento wich

EDIT :

Poiché il siteID è anche in apparecchiatura, propongo un altro tavolo, un piccolo refactoring del database (perché in realtà non lo so come fare questo)

Se si ottengono molti dati, sarebbe un disastro recuperare i dati e calcolare ogni cosa ogni volta che si desidera accedere a tali dati.

Quindi propongo questa tabella

siteCatCount(CatID, siteID, cnt) 

Quindi, quando si modificano i tuoi dati (aggiungere o rimuovere attrezzature) si dovrebbe andare aggiornare questa tabella, sarebbe molto più chiara e non dovrete calcolare il numero di ogni attrezzatura ogni volta

+0

Mi scuso. Era un errore di battitura, la tabella delle attrezzature ha anche un campo ID sito. – tgriffiths

+0

Sì, anche con l'ID sito è un casino :) – GregM