5

私は通常、アプリケーションに必要なSQLクエリを見つけることができますが、最近、作成する必要のあるクロスタブクエリに困惑していて、あなたが助けてくれるかどうか疑問に思っていました。

私は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テーブル内の数量フィールドを使用した各サイト内の各カテゴリアイテムの合計を表します。これまでクロスタブクエリを実行する必要はありませんでしたが、これを機能させるのに苦労しています。

4

2 に答える 2

7

これは、「ピボット」演算子を使用して実行できるはずです。このようなもの(ただし、スペルや構文の詳細を消したと確信しています...):

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] をサイト 1 として、[2] をサイト 2 として」をできるだけ多く含めます。 .」 必要に応じて。

于 2011-10-31T21:04:04.740 に答える
2

サイトと機器を参照する表が欠落していると思います

そんな感じ :

EquipmentSite(SiteID, EquipID)

現在、どのサイトがどの機器であるかを判断することは不可能です。

編集 :

サイトIDも機器に含まれているため、別のテーブルを提案します。データベースを少しリファクタリングします(これを行う方法が本当にわからないため)

大量のデータを取得すると、それらのデータにアクセスするたびにデータを取得してすべてを計算するのは面倒です。

だから私はこのテーブルを提案します

siteCatCount(CatID, siteID, cnt)

したがって、データを変更する (機器を追加または削除する) 場合は、このテーブルを更新します。より明確になり、毎回すべての機器の数を計算する必要がなくなります。

于 2011-10-31T17:07:29.657 に答える