Amira Najihah Ответов: 3

Как вычесть из одной строки столбца в другую строку столбец в той же таблице


Я хочу, чтобы вычесть buyamount от contractno 001 с объемпродаж от contractno 002 для получения суммы выручки

Ниже приведены мои данные

REFNO | DEALMASTERKEY | CONTRACTNO | BUYAMOUNT | SALEAMOUNT | RATE | ДОХОД
==========================================================
2012110 | 123 | 001 | 1,500,000 | 1,000,000 | 1.5 |
2012110 | 456 | 002 | 1,000,000 | 1,700,000 | 1.7 |

Что я уже пробовал:

SELECT 
dd.REFNO, dd.DEALMASTERKEY, dd.CONTRACTNO, dd.BUYAMOUNT, dd.SALEAMOUNT, dd.RATE
,REVENUE = (SELECT ABS(dl.BUYAMOUNT) from DF_DEALMASTER dl where dl.CONTRACTNO = '001' and dl.DEALMASTERKEY = dd.DEALMASTERKEY) - 
(SELECT ABS(dl.SALEAMOUNT) from DF_DEALMASTER dl where dl.CONTRACTNO = '002' and dl.DEALMASTERKEY = dd.DEALMASTERKEY)

FROM DF_DEALMASTER dd

Richard Deeming

Данные, которые вы показали, не имеют никакой связи между этими двумя строками.

Запрос, который вы пробовали, ссылается на столбцы, которых нет в образце данных.

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

Amira Najihah

contractno 001 это первый ряд
contractno 002 это второй ряд

В запросе я пытался получить сумму дохода.
Доход = (дл.buyamount где contractno = 001) - (объемпродаж, где contractno = 002)

доход = 1,500,00 - 1,700,000 (вот как я пытаюсь вычесть)

Amira Najihah

Извините я забыл поставить ссылку нет это галстук в два ряда

3 Ответов

Рейтинг:
2

CHill60

Смотрите комментарии от @RichardDeeming. Ваш первый набор ошибок таков

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'KEY'.
Msg 102, Level 15, State 1, Line 8
Incorrect syntax near '-'.
Msg 156, Level 15, State 1, Line 11
Incorrect syntax near the keyword 'FROM'.
Первый из них вызван тем, что KEY это ключевое слово. При использовании ключевых слов в качестве имен столбцов (избегайте, если это возможно) заключите имя столбца в квадратные скобки, т. е. [KEY]

После сортировки этого вы получаете несколько ошибок, таких как
Msg 207, Level 16, State 1, Line 8
Invalid column name 'DEALMASTERKEY'.
- Вы не поделились с нами полной схемой таблицы. Если я приведу это в порядок то получу
declare @DF_DEALMASTER table ([KEY] int,CONTRACTNO varchar(3), BUYAMOUNT int, SALEAMOUNT int, RATE decimal(15,2))
insert into @DF_DEALMASTER ([KEY],CONTRACTNO, BUYAMOUNT, SALEAMOUNT, RATE) values
(123,'001',1500000, 1000000,  1.5 ),
(456,'002',1000000, 1700000,  1.7 )

SELECT 
dd.[KEY], dd.CONTRACTNO, dd.BUYAMOUNT, dd.SALEAMOUNT, dd.RATE
,REVENUE = (SELECT ABS(dl.BUYAMOUNT) from @DF_DEALMASTER dl where dl.CONTRACTNO = '001') - 
(SELECT ABS(dl.SALEAMOUNT) from @DF_DEALMASTER dl where dl.CONTRACTNO = '002' )

FROM @DF_DEALMASTER dd 
И это возвращает результаты
KEY	CONTRACTNO	BUYAMOUNT	SALEAMOUNT	RATE	REVENUE
123	001	1500000	1000000	1.50	-200000
456	002	1000000	1700000	1.70	-200000
который выглядит, чтобы быть правильным.

Конечно, это будет работать только в том случае, если у вас всегда есть контракты " 001 " и " 002 " для любого заданного значения DEALMASTERKEY

То, что я подозреваю, что вы действительно хотите, это вычесть значения из предыдущий row - в этом случае вы можете использовать функции LAG и LEAD SQL Server ... Оконные функции SQL Server лидируют и отстают[^]


Amira Najihah

объявить @таблица DF_DEALMASTER ([ключ] инт CONTRACTNO тип varchar(3), BUYAMOUNT инт, инт ОБЪЕМПРОДАЖ, которой десятичное число(15,2))
вставить в @DF_DEALMASTER ([KEY],CONTRACTNO, BUYAMOUNT, SALEAMOUNT, RATE) значения
(123,'001',1500000, 1000000, 1.5 ),
(456,'002',1000000, 1700000, 1.7 )

ВЫБИРАТЬ
dd.[KEY], dd.CONTRACTNO, dd.BUYAMOUNT, dd.SALEAMOUNT, dd.RATE
,REVENUE = (SELECT ABS(dl.BUYAMOUNT) from @DF_DEALMASTER dl where dl.CONTRACTNO = '001') -
(Выберите ABS(dl.SALEAMOUNT) из @DF_DEALMASTER dl, где dl.CONTRACTNO = '002' )

От @DF_DEALMASTER dd


Когда я использую этот sql я получаю ошибку

Msg 512, Уровень 16, Состояние 1, Строка 2
Подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует за=, !=, <, <= , >, >= или когда подзапрос используется в качестве выражения.

CHill60

Когда я выполняю этот запрос, я получаю правильные результаты. У вас явно есть более одного номера контракта = '001'.

Amira Najihah

Ключевое слово я изменил, чтобы dealmasterkey

Рейтинг:
2

OriginalGriff

Для этого необходимо установить некоторые правила, которые связывают данные в одной строке с данными в другой.

Если есть "сортируемое" поле, которое вы можете упорядочить с помощью ORDER BY, то вы можете использовать LEAD и LAG для ссылки на значения в следующей или предыдущей строке: LEAD (Transact-SQL) - SQL Server | Microsoft Docs[^] LAG (Transact-SQL) - SQL Server | Microsoft Docs[^]

Если есть столбец, который можно использовать для "связывания" двух связанных строк вместе, вы можете текстировать "соответствующие" данные с помощью JOIN: SQL-соединения[^]

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


Amira Najihah

Галстук буксире, связанные строк refno. Я уже обновляю свой вопрос

Рейтинг:
1

Gerry Schmitz

Я думаю, что у вас есть ответ (200 000), и вы ищете решение.

Возможно, вы просто хотите, чтобы сумма BUYAMOUNT и вычитать, что из "сумму в поле salesamount".

Тот же ответ: 200 000.