SSMS-寻求帮助编写select语句以在SQL中返回重复项[包括示例]
我正在尝试实施验证,以检查同一日期是否以相反顺序输入了相同的外汇汇率。用户将填写由五列组成的电子表格:SSMS-寻求帮助编写select语句以在SQL中返回重复项[包括示例],sql,sql-server,tsql,ssms,Sql,Sql Server,Tsql,Ssms,我正在尝试实施验证,以检查同一日期是否以相反顺序输入了相同的外汇汇率。用户将填写由五列组成的电子表格: 日期 从货币 通货 比率 乘/除 用户将数据添加到电子表格中,以便通过系统导入,下面是一个模拟示例,说明数据在数据库表中的外观: 我已经准备好了验证的结构,我只是想知道如何编写select语句以返回所有行: 具有相同日期的两个方向,如上图中的前两行所示USD和GBP在2023年1月2日都有乘法(M)和除法(D),因此我想返回这些行,因为验证失败,示例中的其他行都不应返回,因为它们是有效
- 日期
- 从货币
- 通货
- 比率
- 乘/除
- 具有相同日期的两个方向,如上图中的前两行所示USD和GBP在2023年1月2日都有乘法(M)和除法(D),因此我想返回这些行,因为验证失败,示例中的其他行都不应返回,因为它们是有效的
CREATE TABLE [tblFXRates](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NOT NULL,
[FromCurrency] [nvarchar](3) NOT NULL,
[ToCurrency] [nvarchar](3) NOT NULL,
[Rate] [decimal](19, 2) NOT NULL,
[Divide/Multiply] [nvarchar](1) NOT NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [tblFXRates] ON
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (1, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'USD', N'GBP', CAST(1.30 AS Decimal(19, 2)), N'M')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (2, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'GBP', N'USD', CAST(1.30 AS Decimal(19, 2)), N'D')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (3, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'GBP', N'EUR', CAST(1.11 AS Decimal(19, 2)), N'M')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (4, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'GBP', N'GBP', CAST(1.00 AS Decimal(19, 2)), N'M')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (5, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'GBP', N'GBP', CAST(1.00 AS Decimal(19, 2)), N'D')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (6, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'USD', N'USD', CAST(1.00 AS Decimal(19, 2)), N'M')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (7, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'USD', N'USD', CAST(1.00 AS Decimal(19, 2)), N'D')
GO
INSERT [tblFXRates] ([ID], [Date], [FromCurrency], [ToCurrency], [Rate], [Divide/Multiply]) VALUES (8, CAST(N'2023-02-01T00:00:00.000' AS DateTime), N'EUR', N'GBP', CAST(0.90 AS Decimal(19, 2)), N'M')
GO
SET IDENTITY_INSERT [tblFXRates] OFF
GO
编辑:
这样做可以:
假设我们只想要那些不同于货币的,但当然你可以改变这一点
SELECT
tbl1.*
FROM
test.tblfxrates tbl1
inner join
test.tblfxrates tbl2 on tbl2.FromCurrency = tbl1.ToCurrency and tbl2.ToCurrency = tbl1.FromCurrency and tbl1.FromCurrency <> tbl1.ToCurrency and tbl1.Date = tbl2.Date
where
tbl1.DivideMultiply <> tbl2.DivideMultiply
order by
tbl1.ID
选择
tbl1*
从…起
test.TBLFX速率tbl1
内连接
test.tblfx在tbl2.from currency=tbl1.to currency和tbl2.to currency=tbl1.from currency和tbl1.from currency tbl1.to currency和tbl1.Date=tbl2.Date上对tbl2进行评级
哪里
tbl1.DivideMultiply tbl2.DivideMultiply
订购人
tbl1.ID
它将返回前两行,当USD/BGP行都只有M或D时会发生什么?两行的速率值不用于确定重复?为什么有多个USD/USD行?这毫无意义,但似乎符合重复条件。例如,如果美元/英镑只有M或D,那么这很好,因为我们可以导入两个方向,但是我试图阻止用户同时输入两个方向,以防费率不匹配。我想我应该包括这些数据,以明确如果它是这样输入的,它不应该包括在这个select语句中,因为我有不同的验证,这确保了在您上面描述的场景发生时抛出异常@SMorit没有必要使用像N'GBP',N'GBP'这样的外汇,那么你的逻辑似乎是对你的逻辑的一个小小的改进。如果你只关心日期,那么为什么要在这个专栏中使用datetime?不要鼓励随意选择的datatypes.added和tbl1.Date=tbl2.Date可能会出现更多问题。在这里,我的本地数据库中有更多的数据,我应用了您的脚本并运行了它,它确实返回了这两行,但是它还返回了两个不应包含的额外行,我已经更新了帖子,并附上了额外返回行的新图像。它似乎没有正确考虑除法-乘法列。因为这两个值都是M,所以我们不想对它们抛出错误,因为它们都是有效的,因为它们都是/M的乘积。@asi没有意义。仅当禁用where条件时才应发生。您最好尝试重新检查或提供更多样本数据。除非,在除法-乘法列中有一些隐藏的空格,导致它们不相等