#sql #sql-server #northwind
#sql #sql-сервер #northwind
Вопрос:
Мне нужно ВЫБРАТЬ и ПОДСЧИТАТЬ количество идентификаторов заказов, которые получили скидку 10%.
Я пытался использовать функцию COUNT, но она учитывает только одно уникальное вхождение объекта, а не для каждого из идентификаторов порядка.
USE Northwind
GO
SELECT a.OrderID, COUNT(a.OrderID) as 'SeqNo', b.ProductName, a.UnitPrice, a.Quantity, a.UnitPrice*a.Quantity as Amount, a.Discount
FROM [Order Details] as a
INNER JOIN [Products] as b
ON a.ProductID = b.ProductID
GROUP BY a.OrderID, b.ProductName, a.UnitPrice, a.Quantity, a.Discount
HAVING a.Discount = 0.1
Я на самом деле хочу, чтобы ‘SeqNo’ ПОДСЧИТЫВАЛ OrderID, но вместо этого все они равны 1.
OrderID SeqNo ProductName UnitPrice Quantity Amount Discount
1 10288 | 1 | Tourtiere | 5.9 | 10 | 59.00 | 0.1
2 10288 | 2 | Scottish Longbreads | 10 | 3 | 30.00 | 0.1
3 10291 | 1 | Konbu | 4.8 | 20 | 96.00 | 0.1
3 10291 | 2 | Gula Malacca | 15.5 | 24 | 372.00 | 0.1
3 10291 | 3 | Mankimup Dried Apples | 42.4 | 2 | 84.8 | 0.1
Комментарии:
1. Вы используете группу by с 5 разными столбцами, поэтому она будет сверяться с таблицей для поиска дубликата (комбинация из 5 столбцов, упомянутых в группе By). Тем не менее, он вернет все записи, как вы показали выше. Если вы хотите подсчитать, вам следует сгруппировать по идентификатору заказа и соответственно суммировать цену за единицу и количество, чтобы это дало вам правильный результат.
Ответ №1:
Вам нужно использовать row_number()
функцию с partition by
и order by
частями как
row_number() over (partition by OrderID order by OrderID ) as SeqNo
для начала 1
для каждого подсчета отдельных OrderID
Ответ №2:
Вы можете использовать ROW_NUMBER
вместо COUNT
, если на то пошло :
USE Northwind
GO
SELECT a.OrderID
, ROW_NUMBER() OVER(ORDER BY a.OrderID ASC) AS 'SeqNo'
, b.ProductName
, a.UnitPrice
, a.Quantity
, a.UnitPrice*a.Quantity as Amount
, a.Discount
FROM [Order Details] as a
INNER JOIN [Products] as b
ON a.ProductID = b.ProductID
GROUP BY a.OrderID, b.ProductName, a.UnitPrice, a.Quantity, a.Discount
HAVING a.Discount = 0.1
Подробнее о ROW_NUMBER
: https://learn.microsoft.com/fr-fr/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017
Ответ №3:
вам нужно подсчитывать отдельные заказы?
select Count(distinct OrderID) from [Order Details] where Discount=0.1
Ответ №4:
Если вам нужно количество таких скидок на заказ, то вы хотите:
SELECT od.OrderID, COUNT(*) as num_discounts
FROM [Order Details] od
WHERE od.Discount = 0.1
GROUP BY od.OrderID;
Если вам нужно количество заказов с такой скидкой в любой строке заказа:
SELECT COUNT(DISTINCT od.OrderID)
FROM [Order Details] od
WHERE od.Discount = 0.1;
Я не уверен, почему вы включили другие столбцы в SELECT
ответ на этот вопрос.