2011-10-31 23 views
5

Zwykle mogę znaleźć wszystkie kwerendy sql, których potrzebuję do moich aplikacji, ale ostatnio zostałem zaskoczony przez zapytanie Cross Tab, które muszę utworzyć i zastanawiałem się, czy mógłbyś pomóc?Serwer Sql 2008 Zapytanie o kartę krzyżową

mam 3 tabele

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

I chciałbym utworzyć kwerendę Krzyż kartę, aby wyświetlić zestaw wyników jak poniżej

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

Liczby wyświetlane reprezentują łącznie każdej pozycji kategorii zasięgu każda strona korzystająca z pola ilościowego w tabeli urządzeń. Nigdy wcześniej nie musiałem wykonywać kwerendy Cross Tab i staram się, aby to działało.

Odpowiedz

7

Powinieneś być w stanie to zrobić z operatorem "przestawnym". Coś takiego (choć jestem pewien, że muffed niektóre ortograficzne lub składni danych ...):

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; 

Problemem jest to, że trzeba znać dokładny zestaw identyfikatorów witryny, którą chcesz umieścić w zapytaniu . Jeśli potrzebujesz bardziej dynamicznej tabeli przestawnej (takiej jak w programie Excel), musisz wygenerować tekst zapytania jako ciąg i użyć sp_executesql, aby go uruchomić. W wygenerowanym tekście dodajesz tyle "[1], [2], [3], [4], [5] ..." i "[1] jako strony 1, [2] jako witryny2. "rzeczy, których potrzebujesz.

+0

To jest super Ray. Bardzo dziękuję za Twoją pomoc. – tgriffiths

2

Myślę, że brakuje tabeli, które czynią odniesienie pomiędzy swojej stronie i urządzeń

coś takiego:

EquipmentSite(SiteID, EquipID) 

Bo teraz to niemożliwe, aby powiedzieć witryny Wich jako wyposażenie Wich

EDIT :

Ponieważ siteID jest również w wyposażeniu, chciałbym zaproponować inny stół, małą bazę danych dla ciebie (bo naprawdę nie wiem jak to zrobić)

Jeśli otrzymasz dużo danych, zbieranie danych i kalkulowanie wszystkiego za każdym razem, gdy będziesz chciał uzyskać dostęp do tych danych, będzie bałagan.

Więc proponuję tej tabeli

siteCatCount(CatID, siteID, cnt) 

Więc kiedy modyfikować wy danych (dodawanie lub usuwanie sprzętu) byś poszedł aktualizować tę tabelę, byłoby znacznie jaśniejsze i przyzwyczajenie się do obliczenia rachubę każdy sprzęt za każdym razem

+0

Moje przeprosiny. To był literówka, tabela Sprzęt również ma pole ID witryny. – tgriffiths

+0

Tak, nawet z siteID to bałagan :) – GregM