SQL Server 2008 Cross Tab Query - PullRequest
       0

SQL Server 2008 Cross Tab Query

5 голосов
/ 31 октября 2011

Я обычно могу выяснить любые SQL-запросы, которые мне нужны для моих приложений, но недавно я был озадачен запросом кросс-таблицы, который мне нужно создать, и мне было интересно, можете ли вы помочь?

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

Отображенные числа представляют общее количество каждого элемента категории на каждом сайте, используяполе количества в таблице оборудования.Раньше мне никогда не приходилось делать запросы кросс-таблиц, и я изо всех сил пытаюсь заставить это работать.

Ответы [ 2 ]

7 голосов
/ 01 ноября 2011

Вы должны быть в состоянии сделать это с помощью оператора 'pivot'.Примерно так (хотя я уверен, что я заглушил некоторые орфографические или синтаксические детали ...):

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;

Проблема в том, что вам нужно знать точный набор идентификаторов сайтов, которые вы хотите включить взапрос.Если вам нужна более динамическая кросс-таблица (как вы можете получить в Excel), тогда вам нужно сгенерировать текст запроса в виде строки и использовать sp_executesql для его запуска.В сгенерированном тексте вы включаете столько «» [1], [2], [3], [4], [5] ... »и« [1] как site1, [2] как site2 .."вещи, которые вам нужны.

2 голосов
/ 31 октября 2011

Я думаю, что вы пропустили таблицу, которая делает ссылку между вашим сайтом и оборудованием

Примерно так:

EquipmentSite(SiteID, EquipID)

Потому что сейчас невозможно сказать, какой сайт как оборудование

РЕДАКТИРОВАТЬ:

Поскольку siteID также находится в оборудовании, я бы предложил другую таблицу, небольшой рефакторинг вашей базы данных (потому что я действительно не знаю, как это сделать)

Если вы получаете много данных, было бы бесполезно получать данные и вычислять каждую вещь каждый раз, когда вы хотите получить доступ к этим данным.

Итак, я предлагаю эту таблицу

siteCatCount(CatID, siteID, cnt)

Таким образом, когда вы изменяете свои данные (добавляете или удаляете оборудование), вы начинаете обновлять эту таблицу, это будет намного понятнее, и вам не нужно будет рассчитывать количество каждого оборудования каждый раз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...