Разделить на подзапрос, возвращающий «Подзапрос вернул более 1 значения». ошибка

У меня есть следующая таблица, в которой у меня есть два заказа на продажу, и каждый заказ на продажу имеет разное количество транзакций.

ПродажаЗаказать Сделка Количество S1 Т1 20 S1 Т2 20 S2 Т1 15 S2 Т2 15 S2 Т3 15

Проблема в том, что я получаю общую сумму заказа на продажу по каждой транзакции в таблице SQL Server, хотя на самом деле их нужно разделить поровну между количеством таких транзакций:

ПродажаЗаказать Сделка Количество S1 Т1 10 S1 Т2 10 S2 Т1 5 S2 Т2 5 S2 Т3 5

Я написал следующий запрос:

SELECT SalesOrder,
     Transaction,
     Max(Amount) / (SELECT COUNT(Transaction) AS Transaction FROM Test_Table GROUP BY SalesOrder)
    FROM Test_Table
    GROUP BY SalesOrder,
        Transaction

Но это дает мне «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=, <, <=, >, >= или когда подзапрос используется как выражение». ошибка. Может кто-нибудь объяснить, что это такое и как исправить эту ошибку?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
286
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Так как в подзапросе вы GROUP BY SalesOrder он возвращает 1 строку для каждого SalesOrder.
Но вы хотите количество транзакций для конкретного SalesOrder.
Используйте оконные функции MAX() и COUNT():

SELECT DISTINCT SalesOrder, Transaction, 
       MAX(Amount) OVER (PARTITION BY SalesOrder, Transaction) / 
       COUNT(*) OVER (PARTITION BY SalesOrder)
FROM Test_Table

Если тип данных столбца Amount — INTEGER, тогда SQL Server выполнит целочисленное деление, поэтому, возможно, вам нужно сначала умножить на 1.0, чтобы получить правильный результат с десятичными знаками:

SELECT DISTINCT SalesOrder, Transaction, 
       1.0 * MAX(Amount) OVER (PARTITION BY SalesOrder, Transaction) / 
       COUNT(*) OVER (PARTITION BY SalesOrder)
FROM Test_Table 

Попробуй это

SELECT SaleOrder, [Transaction]
    , Max(Amount) / COUNT([Transaction]) over (partition by SaleOrder)
FROM Test_Table GROUP BY SaleOrder,[Transaction]
Ответ принят как подходящий

Я не думаю, что вы хотите group by, просто оконные функции:

SELECT SalesOrder, Transaction,
       Amount) / COUNT(*) OVER (PARTITION BY salesorder)
FROM Test_Table;

Другие вопросы по теме