如何按特定顺序为每组输出 3 组信息?
How can I output 3 sets of info in a specific order for each set?
我对一些客户数据进行了大量分析,想展示我在他们的系统中发现的重复数据。
我根据 4 个不同的标准进行匹配,姓名、地址(多个地址和线路)和 Phone(与帐户关联的每个 phone 号码)和电子邮件(与帐户关联的每个电子邮件帐户)。
我把它全部归结为一个 table。
CREATE TABLE [dbo].[dupe_Customers](
[id] [int] IDENTITY(1,1) NOT NULL,
[MatchOn] [varchar](255) NULL,
[DataID] [varchar](255) NULL,
[CustName] [varchar](255) NULL,
[Address] [varchar](255) NULL,
[Phone] [varchar](255) NULL,
[Fax] [varchar](255) NULL,
[Email] [varchar](255) NULL
)
当我展示它时,我想以特定的顺序查看它并在每个数据集中进行排序。
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Name' ORDER BY [CustName]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Address' ORDER BY [Address]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Phone' ORDER BY [Phone]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Email' ORDER BY [Email]
如果我使用 UNION
我当然不能使用 ORDER BY
并且必须为整个数据集选择一个排序...这违背了目的,因为我只能这样做在 table 作为一个整体已经。
我知道我只能输出 4 次 diff,但目标是有一个输出,这样它就可以加载到 Excel 中的单个选项卡上。 (如果您知道如何将多个数据集输出到 Excel 中的单个选项卡,我很想知道该怎么做!)
我唯一能想到的就是将每个都放入一个新的 table 中,并带有一个 id,例如:
SELECT identity (int,1,1) as [id], * INTO newTable FROM [dupe_Customers] WHERE [MatchOn] = 'Name' ORDER BY [CustName]
INSERT INTO newTable
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Address' ORDER BY [Address]
那我就做一个SELECT * FROM newTable ORDER BY [id]
除了感觉“hacky”之外,我不能 100% 确信数据确实以正确的顺序插入到新的 table 中。
这是一个大约有 50 万行的中型数据集。我正在使用 Azure,它比我在本地机器上做事时慢 3-5 倍,所以我想避免处理器密集型的东西,这将花费数小时 运行。
您可以使用 CASE
表达式进行排序:
SELECT *
FROM [dupe_Customers]
WHERE [MatchOn] IN ('Name', 'Address', 'Phone', 'Email')
ORDER BY [MatchOn],
CASE [MatchOn]
WHEN 'Name' THEN CustName
WHEN 'Address' THEN Address
WHEN 'Phone' THEN Phone
WHEN 'Email' THEN Email END;
我对一些客户数据进行了大量分析,想展示我在他们的系统中发现的重复数据。
我根据 4 个不同的标准进行匹配,姓名、地址(多个地址和线路)和 Phone(与帐户关联的每个 phone 号码)和电子邮件(与帐户关联的每个电子邮件帐户)。
我把它全部归结为一个 table。
CREATE TABLE [dbo].[dupe_Customers](
[id] [int] IDENTITY(1,1) NOT NULL,
[MatchOn] [varchar](255) NULL,
[DataID] [varchar](255) NULL,
[CustName] [varchar](255) NULL,
[Address] [varchar](255) NULL,
[Phone] [varchar](255) NULL,
[Fax] [varchar](255) NULL,
[Email] [varchar](255) NULL
)
当我展示它时,我想以特定的顺序查看它并在每个数据集中进行排序。
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Name' ORDER BY [CustName]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Address' ORDER BY [Address]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Phone' ORDER BY [Phone]
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Email' ORDER BY [Email]
如果我使用 UNION
我当然不能使用 ORDER BY
并且必须为整个数据集选择一个排序...这违背了目的,因为我只能这样做在 table 作为一个整体已经。
我知道我只能输出 4 次 diff,但目标是有一个输出,这样它就可以加载到 Excel 中的单个选项卡上。 (如果您知道如何将多个数据集输出到 Excel 中的单个选项卡,我很想知道该怎么做!)
我唯一能想到的就是将每个都放入一个新的 table 中,并带有一个 id,例如:
SELECT identity (int,1,1) as [id], * INTO newTable FROM [dupe_Customers] WHERE [MatchOn] = 'Name' ORDER BY [CustName]
INSERT INTO newTable
SELECT * FROM [dupe_Customers] WHERE [MatchOn] = 'Address' ORDER BY [Address]
那我就做一个SELECT * FROM newTable ORDER BY [id]
除了感觉“hacky”之外,我不能 100% 确信数据确实以正确的顺序插入到新的 table 中。
这是一个大约有 50 万行的中型数据集。我正在使用 Azure,它比我在本地机器上做事时慢 3-5 倍,所以我想避免处理器密集型的东西,这将花费数小时 运行。
您可以使用 CASE
表达式进行排序:
SELECT *
FROM [dupe_Customers]
WHERE [MatchOn] IN ('Name', 'Address', 'Phone', 'Email')
ORDER BY [MatchOn],
CASE [MatchOn]
WHEN 'Name' THEN CustName
WHEN 'Address' THEN Address
WHEN 'Phone' THEN Phone
WHEN 'Email' THEN Email END;