SQL-запрос для сводки и генерации дочерней таблицы - PullRequest
2 голосов
/ 16 января 2012

У меня есть 4 таблицы с диаграммой ниже enter image description here

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

InstitutionType ProductName Quantity

Например.примерные данные таблицы организации

 Id   Name  Address  InstitionTypeId
  1   aaa   ny132    1001
  2   bbb   dx23     1001  
  3   ccc   bn33     1002  

И InstitionProduct подобен этому

     Id  ProductId  Quantity  InstitionId
      1   1000       120       1
      2   1000       100       2
      3   1000       50        3      

Затем я хочу, чтобы результат запроса выводил общее количество данного продукта по типу Instition.Пример выходных данных будет выглядеть следующим образом.

InstitutionTypeId  productId  quantity
1001               1000        220
1002               1000        50 

Поэтому я хочу сгруппировать учреждение по типу и агрегировать количество продуктов для всех групп типов учреждений.

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

Ответы [ 2 ]

3 голосов
/ 16 января 2012
SELECT
  Institution.InstitutionTypeID,
  InstitutionProduct.ProductID,
  SUM(InstitutionProduct.Quantity)
FROM
  Institution
LEFT JOIN
  InstitutionProduct
    ON InstitutionProduct.InstitutionID = Institution.ID
GROUP BY
  Institution.InstitutionTypeID,
  InstitutionProduct.ProductID
1 голос
/ 16 января 2012

Если вы запрашиваете группу, вам нужно использовать либо агрегатные функции, либо группу по всем включенным полям.Причина в том, что «group by» возвращает ровно одну строку на значение «group by», поэтому, если вы введете несгруппированное поле, это может привести к конфликту, если поле имеет более одного значения на ограничение группировки.Даже если это не относится к вашему набору данных, механизм запросов не может знать об этом и выдает ошибку.

Решение состоит в том, чтобы ввести агрегаты для всех полей, не относящихся к группировке, с агрегатами (среди прочих): средними (средние), суммированными (сумма), минимальными (минимальные) и максимальными (максимальными).Это приведет к чему-то вроде

   SELECT i.InstitutionTypeID, i.Institution.ID, SUM(ip.Quantity) 
   FROM Institution I LEFT JOIN InstitutionProduct IP 
         ON IP.InstituationID = I.ID
   GROUP BY i.InstitutionTypeID, i.Institution.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...