Я провел анализ данных некоторых клиентов и хочу представить дубликаты, которые я нашел в их системах.
Я сопоставляю на основе 4 отдельных критериев: Имя, Адрес (несколько адресов и линий), Телефон (каждый номер телефона, связанный с учетной записью) и Электронная почта (каждый адрес электронной почты, связанный с учетной записью).
Свожу все в одну таблицу.
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
и должен выбрать один порядок для всего набора данных... Что противоречит цели, поскольку я уже могу просто сделать это для таблицы в целом.
Я знаю, что могу просто вывести 4 раза разницы, но цель состоит в том, чтобы получить один вывод, чтобы его можно было загрузить на одной вкладке в Excel. (Если вы знаете, как выводить несколько наборов данных на одну вкладку в Excel, мне бы очень хотелось узнать, как это сделать!)
Единственное, о чем я могу думать, это поместить каждую в новую таблицу с идентификатором, например:
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]
В дополнение к ощущению «хакерства» я не уверен на 100%, что данные действительно вставляются в новую таблицу в правильном порядке.
Речь идет о наборе данных среднего размера, содержащем около 500 тыс. строк. Я использую 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;
Это, вероятно, так близко, как я собираюсь получить. Он упорядочивает каждый набор данных так, как я хотел, просто у него нет [MatchOn] в том порядке, в котором я хочу (имя, адрес, телефон, адрес электронной почты), он имеет их в алфавитном порядке.
Используйте выражение
CASE
, чтобы построить предложениеORDER BY
таким образом, чтобы оно упорядочивалось так, как вам нужно.