Результаты объединения не соответствуют ожиданиям - PullRequest
0 голосов
/ 14 сентября 2018

Мне нелепо просить об этом, но я так долго смотрю на свой код, и не могу понять, какой очевидный ответ мне не хватает:

Использование базы данных AdventureWorks2016 У меня есть следующий запрос:

declare @OrderFrequency table (CustomerID int, OrderYear int, OrderFrequency int)

;with OrderFrequency as
(

Select
      CustomerID,
      datepart(month, OrderDate) OrderMonth,
      datepart(year, OrderDate) OrderYear,
      cast(datepart(month, OrderDate) as nvarchar) +'/'+cast(datepart(year, OrderDate) as nvarchar) MonthYearCode
from Sales.SalesOrderHeader
group by CustomerID, datepart(month, OrderDate), datepart(year, OrderDate)

)
insert into @OrderFrequency
Select CustomerID, OrderYear, count(distinct MonthYearCode) OrderFrequency
from OrderFrequency
group by CustomerID, OrderYear
order by CustomerID, OrderYear


declare @CTETable table (CustomerID int, OrderTotal float, OrderMonth int, OrderYear int)
;with CTE as
(
Select
      CustomerID,
      sum(TotalDue) OrderTotal,
      datepart(month, OrderDate) OrderMonth,
      datepart(year, OrderDate) OrderYear
from Sales.SalesOrderHeader
group by CustomerID, datepart(month, OrderDate), datepart(year, OrderDate)

)
insert into @CTETable
select * from CTE

Select CTET.*
from @CTETable CTET
left outer join @OrderFrequency Ord on Ord.CustomerID = CTET.CustomerID
order by CTET.CustomerID, CTET.OrderYear

Мой последний оператор выбора возвращает все из CTET с дополнительными строками, возвращаемыми из объединения в @OrderFrequency.

Должна ли моя спецификация CTET возвращать ТОЛЬКО CTET?

1 Ответ

0 голосов
/ 14 сентября 2018

Если в Ord может быть несколько строк на CustomerID, вы получите больше строк из вашего объединения, чем CTET.Это ваш набор строк, независимо от того, какие столбцы вы решили показать.Независимо от того, выберете ли вы CTET. * Или Ord. *, Количество строк останется неизменным.

Если вы хотите уменьшить этот набор, чтобы исключить дублированные данные в столбцах CTET в результате левого соединения, вместо этого вы можете выбрать отдельный CTET. *.

Какова ваша цель в этомприсоединиться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...