SSMS-寻求帮助编写select语句以在SQL中返回重复项[包括示例]

SSMS-寻求帮助编写select语句以在SQL中返回重复项[包括示例],sql,sql-server,tsql,ssms,Sql,Sql Server,Tsql,Ssms,我正在尝试实施验证,以检查同一日期是否以相反顺序输入了相同的外汇汇率。用户将填写由五列组成的电子表格: 日期 从货币 通货 比率 乘/除 用户将数据添加到电子表格中,以便通过系统导入,下面是一个模拟示例,说明数据在数据库表中的外观: 我已经准备好了验证的结构,我只是想知道如何编写select语句以返回所有行: 具有相同日期的两个方向,如上图中的前两行所示USD和GBP在2023年1月2日都有乘法(M)和除法(D),因此我想返回这些行,因为验证失败,示例中的其他行都不应返回,因为它们是有效

我正在尝试实施验证,以检查同一日期是否以相反顺序输入了相同的外汇汇率。用户将填写由五列组成的电子表格:

  • 日期
  • 从货币
  • 通货
  • 比率
  • 乘/除
用户将数据添加到电子表格中,以便通过系统导入,下面是一个模拟示例,说明数据在数据库表中的外观:

我已经准备好了验证的结构,我只是想知道如何编写select语句以返回所有行:

  • 具有相同日期的两个方向,如上图中的前两行所示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条件时才应发生。您最好尝试重新检查或提供更多样本数据。除非,在除法-乘法列中有一些隐藏的空格,导致它们不相等