Как последовательно считать последовательность чисел

#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 ответ на этот вопрос.