Разница в строках в, казалось бы, одних и тех же запросах?

#sql #adventureworks

Вопрос:

Я использую базу данных adventureworks 2019 и пытаюсь показать таблицу, которая дает:

 Product Name -- AvgListPrice -- AvgStandardCost -- AvgUnitPrice
 

Цена по прейскуранту = цена RRP, Цена за единицу = цена продажи (включая скидки), стандартная стоимость = стоимость продукта.

Я использую следующий запрос:

 SELECT
ProductName,
AvgStandardCost,
AvgListPrice,
AvgUnitPrice,
ROUND(AvgUnitPrice * 100.0 / AvgListPrice, 1) AS PercentDifferenceUnit_List,
ROUND(AvgUnitPrice * 100.0 / AvgStandardCost, 1) AS PercentDifferenceUnit_Cost


FROM

(SELECT
PP.[Name] AS ProductName,
AVG(PP.[ListPrice]) AS AvgListPrice,
AVG(SSOD.[UnitPrice]) AS AvgUnitPrice,
AVG(PP.[StandardCost]) AS AvgStandardCost

FROM
[Sales].[SalesOrderDetail] AS SSOD
INNER JOIN [Production].[Product] AS PP
ON SSOD.[ProductID] = PP.[ProductID]

GROUP BY PP.[Name]
) AS T

WHERE AvgUnitPrice < AvgStandardCost --(AvgUnitPrice < AvgListPrice gives 250 rows)
                                     --(AvgUnitPrice < AvgStandardCost gives 25 rows)
                                     --(Total number of distinct products = 504)

GROUP BY ProductName, AvgListPrice, AvgUnitPrice, AvgStandardCost
 

Вы можете видеть выше, сколько строк возвращается, когда я изменяю предложение WHERE.

Однако, когда я запускаю эти запросы:

 SELECT [Name], [ListPrice] FROM [Production].[Product]
WHERE ListPrice >
(SELECT AVG([UnitPrice]) FROM [Sales].[SalesOrderDetail])
 

Я получаю здесь 136 строк (в отличие от 250 выше)

 SELECT [Name] FROM [Production].[Product]
WHERE StandardCost >
(SELECT AVG([UnitPrice]) AS AvgUnitPrice FROM [Sales].[SalesOrderDetail])
 

Здесь я получаю 98 строк (в отличие от 25 выше)

Я попытался написать запрос, чтобы проверить, совпадает ли avgStandardCost со стандартом (я почти уверен, что для каждого продукта есть только одно значение standardcost и listprice), но, похоже, я не могу заставить его работать.

Итак, в чем причина различий в строках?

Спасибо!

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

1. Эти запросы определенно не являются логически эквивалентными. Ваш второй запрос принимает среднее значение всех продуктов, в то время как первый сравнивает среднее значение внутри продукта.

2. Спасибо за понимание, Серг!