Как создать представление, используя данные из двух таблиц

#sql #sql-server #view

#sql #sql-сервер #Вид

Вопрос:

У меня есть две таблицы

ЭЛЕМЕНТ

  • id (int),
  • модель (varchar),
  • вес (с плавающей точкой),
  • fk_type (int)

Тип

  • id (int),
  • имя (varchar)

И я хочу создать представление с

  • Имя типа (для каждого имени типа) —> varchar
  • numberOfItems (общее количество элементов для имени типа) —> int
  • NumberOfModels (общее количество МОДЕЛЕЙ для имени типа) —> int
  • TotWeight (снова сумма всех элементов, вес которых соответствует имени типа) —> float

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

Имя типа numberOfItems NumberOfModels Общий вес
карандаш 3 2 50
резиновый 1 1 25

Я пробовал что-то подобное, но не могу разобраться в этом

 SELECT 
    Type.Name,
    (SELECT DISTINCT COUNT(Item.fk_Type) FROM Item GROUP BY  Item.fk_Type) NumberOfItems, 
    (SELECT COUNT(Item.Model) FROM Item,Type WHERE Item.fk_Type = Type.Id)NumberOfModels ,
    (SELECT SUM(Item.Weight) FROM Item,Type WHERE Item.fk_Type = Type.Id)TotWeight
FROM 
    Item, Type 
GROUP BY 
    Type.Name 
 

Может кто-нибудь помочь?

Комментарии:

1. Вредные привычки: использование объединений в старом стиле — этот стиль списка таблиц, разделенных запятыми , в старом стиле был заменен соответствующим JOIN синтаксисом ANSI в стандарте SQL ANSI- 92 ( почти 30 лет назад), и его использование не рекомендуется

Ответ №1:

По сути, это запрос агрегации с join :

 select t.name, count(i.id) as num_items,
       count(distinct i.model) as num_models,
       sum(i.weight) as total_weight
from type t left join
     item i
     on i.fk_type = t.id
group by t.name;
 

Ответ №2:

Вы можете использовать объединения

 SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
 

попробуйте посмотреть правильные имена таблиц.