2011-10-31 23 views
5

私は通常、自分のアプリケーションに必要なSQLクエリを見つけ出すことができますが、最近作成しなければならないクロスタブクエリで困惑しています。Sql Server 2008クロスタブクエリ

私は3つのテーブル

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

を持っていると私は、表示された数字は内の各カテゴリの項目の合計を表す

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

の下のような結果セットを表示するには、クロス集計クエリを作成したいです各サイトは、Equipmentテーブル内のquantityフィールドを使用します。前にCross Tabクエリを実行する必要はありませんでした。これを実現するために苦労しています。

答えて

7

あなたは 'pivot'演算子でこれを行うことができます。 (私はいくつかのスペルや構文の詳細をmuffed確信しているのに...)このような何か:

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; 

これに伴う問題は、あなたがクエリに含めるサイトIDの正確なセットを知っておく必要があるということです。より動的なクロス集計が必要な場合(Excelで取得できるような場合)、問合せテキストを文字列として生成し、sp_executesqlを使用してそれを実行する必要があります。生成されたテキストには、「[1]、[2]、[3]、[4]、[5] ... "と" [1]をsite1、[2]あなたが必要としているもの。

+0

これはスーパーレイです。助けてくれてありがとう。 – tgriffiths

2

私はあなたがあなたのサイトや機器

間の参照を作成し、テーブルにそのような何か欠けていると思う:今、それはウィッヒ機器として

EDITをウィッヒサイトを伝えることは不可能ですので

EquipmentSite(SiteID, EquipID) 

を:

siteIDも装備されているので、私は別のテーブルを提案します。あなたのデータベースのリファクタどのようにするか)

多くのデータを取得した場合、データを取得し、それらのデータにアクセスするたびにすべてのものを計算するのは面倒です。

だから私はあなたがこのテーブルを更新して行くだろうだから、あなたはあなたのデータを変更する場合(機器を追加または削除)、それがより明確になり、あなたが文句を言わない、すべての数を計算する必要が

siteCatCount(CatID, siteID, cnt) 

この表を提案機器ごとに

+0

私は謝罪します。それはタイプミスで、EquipmentテーブルにはsiteIDフィールドもあります。 – tgriffiths

+0

ええ、siteIDでさえそれは混乱です:) – GregM