#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;
попробуйте посмотреть правильные имена таблиц.