SQL 基于变量插入
SQL Insert Based on Variables
我需要弄清楚如何执行以下操作。
我有两列。
一个是交易参考,在我的例子中它是一个唯一的数字,我有 4、5、6。
另一个是分析代码 9 字段。这只会是 A、O 或 N。
当分析 9 代码不存在时,在这种情况下 O 和 A 丢失,我需要为每个事务引用创建一行 - 这是因为我需要使用这些代码的组合在 SSIS 中输出一个文件,即使说分析代码 O 不可用,客户也需要一个空白文件。
所以我希望在此示例中创建 6 行。
批次 4、5、6 的 O。
批次 4、5、6 的 A。
您基本上想要找到所有不同的交易参考并将它们与所有可能的代码交叉。然后您需要对其进行过滤以找出缺失的对。
末尾的 LEFT JOIN 将为您进行过滤。
CREATE TABLE [#trans]
(
[Transaction Reference] int,
[Analysis 9 Code] char(1)
)
CREATE TABLE [#codes]
(
[Code] char(1)
)
-- Create a table with all potential code values
INSERT INTO [#codes] ([Code]) VALUES ('A')
INSERT INTO [#codes] ([Code]) VALUES ('N')
INSERT INTO [#codes] ([Code]) VALUES ('O')
-- Insert your dummy data
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (4, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (4, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (5, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
SELECT [ExistingRefs].[Transaction Reference] AS [Transaction Reference],
[#codes].[Code] AS [Analysis 9 Code]
FROM
(
SELECT DISTINCT([Transaction Reference]) [Transaction Reference] FROM [#trans]
) [ExistingRefs]
CROSS JOIN [#codes]
LEFT JOIN [#trans] ON [ExistingRefs].[Transaction Reference] = [#trans].[Transaction Reference]
AND [#codes].[Code] = [#trans].[Analysis 9 Code]
WHERE [#trans].[Analysis 9 Code] IS NULL
DROP TABLE [#trans]
DROP TABLE [#codes]
请尝试以下操作。
select distinct t.[Transaction Reference],x.code from #trans t
cross apply(select distinct code from #codes c inner join #trans tt on c.Code<>tt.[Analysis 9 Code])x
order by t.[Transaction Reference]
谢谢
我需要弄清楚如何执行以下操作。
我有两列。
一个是交易参考,在我的例子中它是一个唯一的数字,我有 4、5、6。
另一个是分析代码 9 字段。这只会是 A、O 或 N。
当分析 9 代码不存在时,在这种情况下 O 和 A 丢失,我需要为每个事务引用创建一行 - 这是因为我需要使用这些代码的组合在 SSIS 中输出一个文件,即使说分析代码 O 不可用,客户也需要一个空白文件。
所以我希望在此示例中创建 6 行。 批次 4、5、6 的 O。 批次 4、5、6 的 A。
您基本上想要找到所有不同的交易参考并将它们与所有可能的代码交叉。然后您需要对其进行过滤以找出缺失的对。
末尾的 LEFT JOIN 将为您进行过滤。
CREATE TABLE [#trans]
(
[Transaction Reference] int,
[Analysis 9 Code] char(1)
)
CREATE TABLE [#codes]
(
[Code] char(1)
)
-- Create a table with all potential code values
INSERT INTO [#codes] ([Code]) VALUES ('A')
INSERT INTO [#codes] ([Code]) VALUES ('N')
INSERT INTO [#codes] ([Code]) VALUES ('O')
-- Insert your dummy data
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (4, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (4, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (5, 'N')
INSERT INTO [#trans] ([Transaction Reference], [Analysis 9 Code]) VALUES (6, 'N')
SELECT [ExistingRefs].[Transaction Reference] AS [Transaction Reference],
[#codes].[Code] AS [Analysis 9 Code]
FROM
(
SELECT DISTINCT([Transaction Reference]) [Transaction Reference] FROM [#trans]
) [ExistingRefs]
CROSS JOIN [#codes]
LEFT JOIN [#trans] ON [ExistingRefs].[Transaction Reference] = [#trans].[Transaction Reference]
AND [#codes].[Code] = [#trans].[Analysis 9 Code]
WHERE [#trans].[Analysis 9 Code] IS NULL
DROP TABLE [#trans]
DROP TABLE [#codes]
请尝试以下操作。
select distinct t.[Transaction Reference],x.code from #trans t
cross apply(select distinct code from #codes c inner join #trans tt on c.Code<>tt.[Analysis 9 Code])x
order by t.[Transaction Reference]
谢谢