Объединение двух таблиц на основе проанализированного содержимого столбца - PullRequest
1 голос
/ 13 июля 2011

Я пытаюсь объединить две таблицы, основанные на двух столбцах, которые были объединены (часто несовершенно) в другой столбец таблицы. Я пытаюсь объединить таблицы, чтобы правильные записи были связаны друг с другом, чтобы я мог сравнить поля FDebit и Debit.

FMEMO обычно генерируется путем взятия Num, затем добавления space, затем добавления текста Memo. Как вы можете видеть ниже, наш процесс еще не совершенен. Поэтому я бы хотел сопоставить Num, затем space, затем первые 10 символов поля Memo с полем FMEMO.

Я включил приведенный ниже код в пример данных. Не могли бы вы предложить мне несколько советов о том, как этого добиться?

Таблица счетов

MEMO Num DEBIT
Расходные материалы. Сото Кано 1135 2,25
Всасывающий шланг (1-1 / 2 ") к пище 3 74.04
Шланг / шланг: оплетенный шланг (1 ") by the food 3 98.72
QP10 Поверхностный насос Meyers (60 Гц) 3 206,27
Клетка с баком для квасцов, коробкой квасцов и 2 ведрами квасцов 3 752.03
Клетка с клапанным коллектором, F1 & F2 3 3774.08
клетка с IBC в нем 1135 268,41
Аксессуары из ПВХ для монтажа LWTS. 1175 4,26
Аксессуары из ПВХ для монтажа LWTS. 1175 27,26

Таблица расходов

FMEMO FDebit Расходные материалы. Сото Кано 41,8 2,25
3 Всасывающий шланг (1-1 / 2 74.04
3 Шланг / шланг: плетеный шланг (1 98.72
3 QP10 Майерс поверхностный насос (60 Гц) 3970 206,27
3 клетки, в том числе бак, квасцы для квасцов и 2 ведра квасцов 14474 752.03
3 Клетка, включая клапанный коллектор, F1 & F2 72638 3774.08
3 клетки с IBC в нем 5166 268,41
1175 ПВХ аксессуары для установки LWTS. 82,03 4,26
1175 ПВХ аксессуары для установки LWTS. 524,67 27,26

Код для тиражирования:

CREATE TABLE #tempExpenses (
FMEMO varchar(Max), FDebit money)

CREATE TABLE #tempInvoices (
MEMO varchar(Max), Num integer, DEBIT money)

INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('Supplies. Soto Cano 41.8', 2.25)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Suction Hose (1-1/2', 74.04)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Hose/Tubing:Braided Hose (1', 98.72)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 QP10 Meyers surface pump (60hz) 3970', 206.27)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Cage including f tank, alum parts box and 2 buckets of alum 14474', 752.03)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Cage including valve manifold, F1 & F2 72638', 3774.08)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 cage with IBC in it 5166', 268.41)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('1175 Pvc accesories for installation of LWTS. 82.03', 4.26)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('1175 Pvc accesories for installation of LWTS. 524.67', 27.26)<br/>

INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Supplies. Soto Cano', 1135, 2.25)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Suction Hose (1-1/2") by the food', 3, 74.04)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Hose/Tubing:Braided Hose (1") by the food', 3, 98.72)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('QP10 Meyers surface pump (60hz)', 3, 206.27)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Cage including f tank, alum parts box and 2 buckets of alum', 3, 752.03)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Cage including valve manifold, F1 & F2', 3, 3774.08)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('cage with IBC in it', 1135, 268.41)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Pvc accesories for installation of LWTS.', 1175, 4.26)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Pvc accesories for installation of LWTS.', 1175, 27.26)<br/>

SELECT *
FROM #tempExpenses 

SELECT *
FROM #tempInvoices

1 Ответ

5 голосов
/ 13 июля 2011

Ну, я действительно ненавижу себя за создание этого TSQL, но я думаю, что это то, что вы ищете:

SELECT *
FROM #tempInvoices i
INNER JOIN #tempExpenses e ON CAST(Num as varchar(10)) + ' ' + SUBSTRING(MEMO,1,9-LEN(CAST(NUM as varchar(10)))) = SUBSTRING(FMEMO,1,10)

, который объединяет число и принимает столько символов, образует поле, т.е. если 3, то 9, если 1111, то 9-4, и соединения с тем же количеством символов образуют другую таблицу.

Конечно, это очень неэффективный и уродливый запрос. Я бы предпочел нормализовать данные в базе данных (разобрать и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...