Судя по запросу вы публикуемую в качестве ответа, вы, кажется, запутался , Попробуйте создать результирующий скрипт, выполнив одно за раз. Прежде всего, не используйте переменные в начале, а возвращайте данные, используя обычный запрос.
И в качестве базового запроса используйте тот, который получает только самый большой заказ и его идентификатор. Для этого было бы достаточно, чтобы взять только OrderItems
таблицу, сгруппировать данные по OrderID
и ограничить результаты верхнего порядка общего:
SELECT TOP (1)
OrderID,
OrderTotal = SUM((ItemPrice - DiscountAmount) * Quantity)
FROM
dbo.OrderItems
GROUP BY
OrderID
ORDER BY
OrderTotal DESC
;
Для того, чтобы узнать идентификатор клиента, который сделал заказ возвращается по вышеуказанному запросу вы можете добавить соединение к Orders
. Вы также должны изменить предложения GROUP BY для включения CustomerID
в него:
SELECT TOP (1)
o.CustomerID,
oi.OrderID,
OrderTotal = SUM((oi.ItemPrice - oi.DiscountAmount) * oi.Quantity)
FROM
dbo.OrderItems AS oi
INNER JOIN dbo.Orders AS o ON oi.OrderID = o.OrderID
GROUP BY
oi.OrderID,
o.CustomerID
ORDER BY
OrderTotal DESC
;
На этом этапе вы можете хранить CustomerID
в переменную временно и использовать его во втором запросе, чтобы прочитать имя клиента от Customers
.Это на самом деле не нужно, так как вы можете вернуть все данные в одном запросе:
SELECT TOP (1)
CustomerName = c.FirstName + ' ' + c.LastName,
OrderTotal = SUM((oi.ItemPrice - oi.DiscountAmount) * oi.Quantity)
FROM
dbo.OrderItems AS oi
INNER JOIN dbo.Orders AS o ON oi.OrderID = o.OrderID
INNER JOIN dbo.Customers AS c ON o.CustomerID = c.CustomerID
GROUP BY
oi.OrderID,
o.CustomerID,
c.FirstName, c.LastName
ORDER BY
OrderTotal DESC
;
Как вы можете видеть, другое присоединиться добавляются к запросу и предложения GROUP BY модифицируются еще раз, чтобы включить столбцы FirstName
и LastName
.
И теперь пришло время ввести назначение переменной для запроса, чтобы вместо возврата результатов в виде строки, которую вы могли бы сохранить и затем распечатать.
SELECT TOP (1)
@Customer = c.FirstName + ' ' + c.LastName,
@LargestOrder = SUM((oi.ItemPrice - oi.DiscountAmount) * oi.Quantity)
FROM
dbo.OrderItems AS oi
INNER JOIN dbo.Orders AS o ON oi.OrderID = o.OrderID
INNER JOIN dbo.Customers AS c ON o.CustomerID = c.CustomerID
GROUP BY
oi.OrderID,
o.CustomerID,
c.FirstName,
c.LastName
ORDER BY
OrderTotal DESC
;
Обратите внимание, что запрос не использует фильтр WHERE. Вы не можете заранее знать идентификатор клиента. Это техника TOP (1)
+ ORDER BY
, которая позволяет вам это выяснить.
Попробуйте использовать 'LIMIT' в свой' SET @CN = (SELECT CustomerName FROM @BigCustomer) 'например и другую команду' SET'. – Edper
Можете ли вы предоставить образцы данных и желаемые результаты? Как написано, ваш оператор 'group by' не имеет большого смысла. Скорее всего, вам не нужны какие-либо из этих переменных ... – sgeddes
'@ IT', вероятно, NULL. вы никогда не устанавливали его. Хотя вы устанавливаете '@ CN' дважды. 'SET @CN = (SELECT ItemTotal FROM @BigCustomer)' -> 'SET @IT = (SELECT ItemTotal FROM @BigCustomer)'? Может ли 'CONVERT (nvarchar (50), @IT) работать с нулями? – Brad