DJPops Ответов: 2

Получите значение столбца 'balanced' как 'Y', если обе строки имеют одинаковый amt, и 'N', если его нет в SQL-запросе


Как получить "сбалансированное" значение столбца "Y", если столбец кредит и дебет amt совпадают, и "N", если они не совпадают

Pymtid ID имя тип AMT
ЧТ 1 ПР 100
CHT1 1 A DR 100
BHT 2 B CR 100
BHT1 2 B DR 90
DHT 3 C CR 150
DHT1 3 C DR 150


требуемый результат :


Pymtid ID имя тип AMT сбалансированный
ЧТ 1 ПР 100 Г
CHT1 1 A DR 100 Y
BHT 2 B CR 100 N
BHT1 2 B DR 90 N
DHT 3 C CR 150 Y
DHT1 3 C DR 150 Y

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

select 
case when 
(T.Amt = (select  P.Amt 
from BankData as p  
where P.Type = 'cr'
and p.ID = T.ID and t.Type = 'DR')) then 'Y' 
else 'N' end AS 'Balance', 
Name, *
 from BankData AS t

2 Ответов

Рейтинг:
10

Member 7870345

Во-первых, вы можете создать представление, содержащее сумму транзакций с таким кодом, как:

CREATE VIEW [dbo].[bankDataGrouped]
AS
SELECT      ID, Name, Type, CustId, SUM(Amt) AS amt
FROM         dbo.BankData
GROUP BY ID, Name, Type, CustId
ORDER BY ID, Name, Type, CustId

GO


(Затем вы можете запросить "bankDataGrouped", чтобы получить сумму записей)

Вместо того, чтобы использовать bankdata использовать bankDataGrouped с
SELECT  b1.*, 
   CASE WHEN (b1.amt=b2.amt) THEN 'Y'
   ELSE 'N' END AS 'Balance',
   customer.address
FROM bankdatagrouped b1
JOIN bankdatagrouped b2
	ON b1.id=b2.id AND (b1.type<>b2.type)
JOIN customer 
	ON b1.custid=customer.custid


вы можете присоединиться как к bankdatagrouped, так и к клиенту.

Если это работает, пожалуйста, отметьте мой anwser как "anwser принят".


DJPops

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

DJPops

Спасибо за вашу помощь , вот один запрос Ans .
https://stackoverflow.com/questions/50175031/get-balanced-column-value-as-y-if-both-rows-has-same-amt-and-n-if-not-in-s

Рейтинг:
0

Member 7870345

Пожалуйста, попробуйте:

SELECT  b1.*, 
   CASE WHEN (b1.amt=b2.amt) THEN 'Y'
   ELSE 'N' END AS 'Balance'
FROM bankdata b1
JOIN bankdata b2
ON b1.id=b2.id AND (b1.type<>b2.type)


Объяснение:
Нам нужны все столбцы bankdata (в псевдониме запроса b1) и еще один столбец (называемый "баланс") со значением " Y " или " N " в зависимости от того, имеет ли запись с тем же идентификатором, но разным типом одинаковую сумму или нет.
Таким образом, мы соединяем таблицу bankdata с ней самой (но теперь с псевдонимом b2). Этот вход разрешен для соединения заключается в том, что ID в обоих псевдонимов, но, что значение типа различны (так, если значение типа В В1 ЧР, то в ячейке B2 должно быть особым ЧР (то есть доктора), и если значение типа В В1 Д в Б2 должны быть различны доктора (то есть ОК)).
Значение столбца "баланс" может быть оценено с помощью регистра в зависимости от того, будет ли сумма равна или различна в двух псевдонимах.


DJPops

спасибо выше код работает нормально, но имея одну проблему bankdata имеет соединение с таблицей клиентов, так что я могу использовать "JOIN bankdata b2" после вышеуказанного соединения клиентов

Member 7870345

Теоретически здесь нет никаких проблем.
Можете ли вы прислать мне текст вашего запроса с соединениями с клиентом?

DJPops

дайте 10 минут , я предоставлю то, что именно я ищу

DJPops

Пожалуйста, найдите приведенный ниже скрипт для таблицы bankdata и customer ,

Как показано в bankdata там будет несколько типов времени DR и CR в которых для одного и того же идентификатора нам нужно
для проверки сумма д = сумма КР .

Означает, что если есть 2 записи для DR и CR как против id 2, то нам нужно сделать сумму DR amt и сумму CR amt, а затем столбец баланса будет иметь 'Y' или 'N', если amt совпадают или не совпадают





ИСПОЛЬЗУЙТЕ [DATADB]
ГО
/****** Объект: таблица [dbo].[BankData] дата сценария: 04-05-2018 3.54.46 вечера ******/
УСТАНОВИТЕ ANSI_NULLS НА
ГО
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО
УСТАНОВИТЬ ПАРАМЕТР ANSI_PADDING НА
ГО
Создайте таблицу [dbo].[Банковские данные](
[ID] [int] NOT NULL,
[Имя] [nchar](10) NULL,
[Amt] [decimal](18, 0) NULL,
[Type] [char](10) NULL,
[TransId] [int] IDENTITY(1,1) NOT NULL,
[CustId] [int] NULL
) НА [ПЕРВИЧНОМ]

ГО
НАБОР ВЫБРАНО ЗНАЧЕНИЕ ВЫКЛ.
ГО
/****** Объект: таблица [dbo].[Покупатель] Дата написания сценария: 04-05-2018 3.54.46 вечера ******/
УСТАНОВИТЕ ANSI_NULLS НА
ГО
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО
Создайте таблицу [dbo].[Покупатель](
[CustId] [int] NULL,
[Адрес] [nvarchar](50) NULL
) НА [ПЕРВИЧНОМ]

ГО
Установите IDENTITY_INSERT [dbo].[BankData] ВКЛ.

Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (1, N'Yash ', CAST(300 AS Decimal(18, 0)), N'Dr ', 1, 1)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (1, N'Yash ', CAST(300 AS Decimal(18, 0)), N'CR ', 2, 1)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (2, N ' FALE ', CAST(120 AS Decimal(18, 0)), N ' Dr ', 3, 2)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (2, N ' FALE ', CAST(140 AS Decimal(18, 0)), N ' CR ', 4, 2)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) ЗНАЧЕНИЯ (3, N'RAHUL ', CAST(100 AS Decimal(18, 0)), N'CR ', 5, 3)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) ЗНАЧЕНИЯ (3, N'RAHUL ', CAST(100 AS Decimal(18, 0)), N'Dr ', 6, 3)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (4, N'DINESH ', CAST(900 AS Decimal(18, 0)), N'CR ', 7, 4)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (4, N'DINESH ', CAST(900 AS Decimal(18, 0)), N'Dr ', 8, 4)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (2, N ' FALE ', CAST(30 AS Decimal(18, 0)), N ' Dr ', 9, 2)
Вставить [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) Значения (2, N ' FALE ', CAST(130 AS Decimal(18, 0)), N ' Dr ', 10, 2)
Установите IDENTITY_INSERT [dbo].[BankData] выкл.
Вставить [dbo].[Клиент] ([CustId], [Адрес]) Значения (1, N'Mumbai')
Вставить [dbo].[Клиент] ([CustId], [Адрес]) Значения (2, N'Delhi')
Вставить [dbo].[Клиент] ([CustId], [Адрес]) Значения (3, N 'Pune')
Вставить [dbo].[Клиент] ([CustId], [Адрес]) Значения (4, N'Banglore')
Вставить [dbo].[Клиент] ([CustId], [Адрес]) Значения (5, N'Surat')