Как рассчитать последовательно последовательность чисел - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно выбрать и подсчитать количество идентификаторов 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

Ответы [ 4 ]

0 голосов
/ 09 апреля 2019

Если вы хотите количество таких скидок на заказ, то вам нужно:

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, чтобы ответить на этот вопрос.

0 голосов
/ 09 апреля 2019

Вам необходимо использовать функцию row_number() с partition by и order by частями как

row_number() over (partition by OrderID  order by OrderID ) as SeqNo

, чтобы начать с 1 для каждого подсчета различных OrderID

0 голосов
/ 09 апреля 2019

Вам нужно считать различные заказы?

select Count(distinct OrderID) from [Order Details] where Discount=0.1
0 голосов
/ 09 апреля 2019

Вы можете использовать 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/row-number-transact-sql?view=sql-server-2017

...