Получить «сбалансированное» значение столбца как «Y», если обе строки имеют одинаковые значения amt и «N», если не в запросе SQL - PullRequest
0 голосов
/ 04 мая 2018

У меня есть количество записей CR и DR для одного идентификатора, Мне нужно проверить сумму совпадений суммы DR с суммой суммы CR для того же идентификатора, если CR совпадает с DR, а затем отобразить столбец Сбалансированный как «Y», иначе «N»

Обязательный результат: Сбалансированное значение столбца «Y», если столбец «Кредит и дебет» совпадает, и «N», если они не совпадают

Примечание: для этого необходим один запрос:

enter image description here

Как показано на рисунке выше, требуется красный выделенный результат.

Сценарий приведен ниже:

USE [data]
GO
/****** Object:  Table [dbo].[BankData]    Script Date: 04-05-2018 3.54.46 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[BankData](
    [ID] [int] NOT NULL,
    [Name] [nchar](10) NULL,
    [Amt] [decimal](18, 0) NULL,
    [Type] [char](10) NULL,
    [TransId] [int] IDENTITY(1,1) NOT NULL,
    [CustId] [int] NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Customer]    Script Date: 04-05-2018 3.54.46 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
    [CustId] [int] NULL,
    [Address] [nvarchar](50) NULL
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[BankData] ON 

INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (1, N'YASH      ', CAST(300 AS Decimal(18, 0)), N'DR        ', 1, 1)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (1, N'YASH      ', CAST(300 AS Decimal(18, 0)), N'CR        ', 2, 1)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (2, N'FALE      ', CAST(120 AS Decimal(18, 0)), N'DR        ', 3, 2)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (2, N'FALE      ', CAST(140 AS Decimal(18, 0)), N'CR        ', 4, 2)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (3, N'RAHUL     ', CAST(100 AS Decimal(18, 0)), N'CR        ', 5, 3)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (3, N'RAHUL     ', CAST(100 AS Decimal(18, 0)), N'DR        ', 6, 3)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (4, N'DINESH    ', CAST(900 AS Decimal(18, 0)), N'CR        ', 7, 4)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (4, N'DINESH    ', CAST(900 AS Decimal(18, 0)), N'DR        ', 8, 4)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (2, N'FALE      ', CAST(30 AS Decimal(18, 0)), N'DR        ', 9, 2)
INSERT [dbo].[BankData] ([ID], [Name], [Amt], [Type], [TransId], [CustId]) VALUES (2, N'FALE      ', CAST(130 AS Decimal(18, 0)), N'DR        ', 10, 2)
SET IDENTITY_INSERT [dbo].[BankData] OFF
INSERT [dbo].[Customer] ([CustId], [Address]) VALUES (1, N'Mumbai')
INSERT [dbo].[Customer] ([CustId], [Address]) VALUES (2, N'Delhi')
INSERT [dbo].[Customer] ([CustId], [Address]) VALUES (3, N'Pune')
INSERT [dbo].[Customer] ([CustId], [Address]) VALUES (4, N'Banglore')
INSERT [dbo].[Customer] ([CustId], [Address]) VALUES (5, N'Surat')

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я использую In-query, чтобы получить сбалансированный столбец. Я группирую по ID, а затем получаю сумму Amt. Если тип CR, то он отрицательный (-1 * Amt), а если DR, то положительный. Затем я сделал запрос для таблицы bankData и назначил ее собственный идентификатор (t1.ID = t.ID). Если сумма равна нулю, то она сбалансирована = 'Y', иначе это не так ('N').

select [ID], [Name], [Amt], [Type], [TransId], [CustId],
(select case when sum(case when [Type]='DR' then [Amt] else -1*[Amt] end)=0 
   then 'Y' 
   else 'N' end 
from [dbo].[BankData] as t1
where t1.[ID] = t.[ID]
group by t1.[ID]) as Balanced
from [dbo].[BankData] as t
order by t.[ID], t.[TransId]
0 голосов
/ 04 мая 2018

Если 2012+, это маленький вопрос, используя оконную функцию sum() over

Пример

Select *
      ,Balanced = IIF(sum(Amt * IIF([Type]='CR',-1,1)) over (Partition By ID) =0,'Y','N')
 from [BankData]

Returns

ID  Name    Amt Type    TransId CustId  Balanced
1   YASH        300 DR          1   1   Y
1   YASH        300 CR          2   1   Y
2   FALE        120 DR          3   2   N
2   FALE        140 CR          4   2   N
2   FALE        30  DR          9   2   N
2   FALE        130 DR          10  2   N
3   RAHUL       100 CR          5   3   Y
3   RAHUL       100 DR          6   3   Y
4   DINESH      900 CR          7   4   Y
4   DINESH      900 DR          8   4   Y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...