Мне нужно ВЫБРАТЬ и СЧИТАТЬ количество идентификаторов OrderID, которые получили скидку 10%.
Я пытался использовать функцию COUNT, но она подсчитывает только одно уникальное вхождение сущности, а не для каждого из идентификаторов OrderID.
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
Вы можете использовать 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://docs.microsoft.com/fr-fr/sql/t-sql/functions/номер-строки-транзакции-sql?view=sql-server-2017
Вам нужно использовать функцию row_number()
с частями partition by
и order by
как
row_number() over (partition by OrderID order by OrderID ) as SeqNo
начинать с 1
для каждого подсчета различных OrderID
вам нужно количество различных заказов?
select Count(distinct OrderID) from [Order Details] where Discount=0.1
Если вы хотите количество таких скидок на заказ, то вы хотите:
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
, чтобы ответить на этот вопрос.
Вы используете группу с 5 разными столбцами, поэтому она будет проверять таблицу на наличие дубликатов (комбинация 5 столбцов, упомянутых в группе «По»). Тем не менее, он вернет все записи, как вы показали выше. Если вам нужен подсчет, вам следует сгруппировать по идентификатору заказа и соответственно суммировать цену за единицу и количество, чтобы получить правильный результат.