SQL Server 2014 - другое взаимодействие таблиц и SUM - PullRequest
0 голосов
/ 06 декабря 2018

Если говорить кратко с текстом, у меня есть база данных, в которой мне нужно просто выбрать 10 лучших продуктов, с максимальной прибылью в 2008 году. (У меня есть образец базы данных)

У меня есть одна огромная проблема.

Вот неполный, но рабочий код:

SELECT 
    [AdventureWorksDW2012].[dbo].[FactInternetSales].ProductKey,    
    SUM([AdventureWorksDW2012].[dbo].[FactInternetSales].OrderQuantity) OrderQuantitySum
FROM
    [AdventureWorksDW2012].[dbo].[FactInternetSales]
GROUP BY 
    ProductKey
ORDER BY 
    OrderQuantitySum DESC;

Вот вывод:

enter image description here

InдБ, у меня есть заказы и продукты, так что в основном может быть продукт с идентификатором 15, например, и он может иметь много заказов, например, 200-300.Я суммировал все заказы и сгруппировал одинаковые идентификаторы.

Теперь мне нужно ограничить все заказами, которые произошли только в 2008 году, я складываю еще одну таблицу и вот код:

SELECT 
    [AdventureWorksDW2012].[dbo].[FactInternetSales].ProductKey,    
    SUM([AdventureWorksDW2012].[dbo].[FactInternetSales].OrderQuantity) OrderQuantitySum,
    [AdventureWorksDW2012].[dbo].[DimDate].CalendarYear
FROM
    [AdventureWorksDW2012].[dbo].[FactInternetSales], [AdventureWorksDW2012].[dbo].[DimDate]
WHERE 
    CalendarYear = 2008
GROUP BY 
    ProductKey, CalendarYear
ORDER BY 
    OrderQuantitySum DESC;

И вот вывод:

enter image description here

Так что моя сумма заказов стала безумно огромной, и я не понимаю, почему ...

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

Есть предложения?

1 Ответ

0 голосов
/ 06 декабря 2018

То, что вы делаете, это декартово соединение, которое возвращает ALL возможные комбинации каждой строки в таблицах FactInternetSales и DimDate.Вы захотите использовать INNER JOIN, как показано ниже, и фильтр CalendarYear можно использовать в соединении вместо добавления предложения WHERE.Будучи ВНУТРЕННИМ объединением, это будет по-прежнему ограничивать строки с FactInternetSales календарным годом 2008, поскольку в набор результатов будут включены только строки из этой таблицы, у которых есть совпадение в DimDate.Я не использовал эти таблицы, но я предполагаю, что они имеют общий столбец DateKey или аналогичный столбец (т. Е. Столбец, который будет уникальным в DimDate и относится к столбцу в FactInternetSales).Вместо этого используйте псевдонимы таблиц для полных имен для лучшей читаемости.Псевдоним таблицы не является обязательным в ORDER BY, так как этот столбец был псевдонимом в SELECT, а ORDER BY вычисляется после SELECT, поэтому имя OrderQuantitySum здесь допустимо.Ваш SQL, вероятно, будет выглядеть примерно так:

SELECT 
FIS.ProductKey,
SUM(FIS.OrderQuantity) AS OrderQuantitySum,
DD.CalendarYear
FROM [AdventureWorksDW2012].[dbo].[FactInternetSales] FIS
INNER JOIN [AdventureWorksDW2012].[dbo].[DimDate] DD ON FIS.DateKey = DD.DateKey AND DD.CalendarYear = 2008
GROUP BY FIS.ProductKey, DD.CalendarYear
ORDER BY OrderQuantitySum DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...