2011-10-31 44 views
5

Tôi thường có thể tìm ra bất kỳ truy vấn sql nào tôi cần cho các ứng dụng của mình, nhưng gần đây tôi đã bị bối rối bởi truy vấn Cross Tab mà tôi cần tạo và tự hỏi liệu bạn có thể trợ giúp không?Truy vấn Tab Sql Server 2008

Tôi có 3 bảng

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

Và tôi muốn tạo ra một truy vấn chéo Tab để hiển thị một tập hợp kết quả như dưới đây

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

Những con số hiển thị đại diện cho một tổng của từng hạng mục loại trong vòng mỗi trang web sử dụng trường số lượng withint bảng thiết bị. Tôi chưa bao giờ phải làm một truy vấn Cross Tab trước và tôi đang đấu tranh để làm việc này.

Trả lời

7

Bạn sẽ có thể thực hiện việc này với toán tử 'pivot'. Một cái gì đó như thế này (mặc dù tôi chắc chắn tôi muffed một số lỗi chính tả hoặc cú pháp chi tiết ...):

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; 

Vấn đề ở đây là bạn cần phải biết các thiết lập chính xác của id trang web mà bạn muốn bao gồm trong truy vấn . Nếu bạn cần một crosstab năng động hơn (như bạn có thể nhận được trong Excel), thì bạn cần tạo ra văn bản truy vấn dưới dạng một chuỗi và sử dụng sp_executesql để chạy nó. Trong văn bản được tạo, bạn bao gồm nhiều "[1], [2], [3], [4], [5] ..." và "[1] làm site1, [2] làm site2 .. "Những thứ bạn cần.

+0

Đây là siêu Ray. Cảm ơn sự giúp đỡ của bạn. – tgriffiths

2

Tôi nghĩ mất tích của bạn một bảng mà làm cho một tham chiếu giữa trang web và thiết bị của bạn

Something như thế:

EquipmentSite(SiteID, EquipID) 

Bởi vì bây giờ nó không thể nói với trang web Mà như thiết bị Mà

EDIT :

Vì siteID cũng có trong thiết bị, tôi sẽ đề xuất một bảng khác, một trình tái cấu trúc nhỏ của cơ sở dữ liệu của bạn (vì tôi thực sự không biết làm thế nào để làm điều này)

Nếu bạn nhận được nhiều dữ liệu, việc tìm nạp dữ liệu sẽ là một mớ hỗn độn và tính toán mọi thứ mỗi khi bạn muốn truy cập dữ liệu đó.

Vì vậy, tôi đề nghị bảng này

siteCatCount(CatID, siteID, cnt) 

Vì vậy, khi bạn sửa đổi cho bạn dữ liệu (thêm hoặc loại bỏ thiết bị) bạn sẽ đi cập nhật bảng này, nó sẽ được rõ ràng hơn nhiều và bạn sẽ không phải tính toán số lượng của mỗi thiết bị mỗi lần

+0

Tôi xin lỗi. Đó là lỗi đánh máy, Bảng thiết bị cũng có trường siteID. – tgriffiths

+0

Vâng, ngay cả với siteID nó là một mớ hỗn độn :) – GregM

Các vấn đề liên quan