#sql #sql-server #sql-server-2005 #tsql
#sql #sql-сервер #sql-server-2005 #tsql
Вопрос:
- Таблица 1: LocID, Prod_ID, Metric_ID, Metric_Data
- Таблица 2: LocID, Metric_ID, Metric_Data
Мне нужна результирующая таблица в виде:
- LocID
- Prod_ID
- Metric_ID
-
Metric_Data при соблюдении следующих условий:
- При совпадении Metric_ID будет добавлено значение Metric_Data
- Если Metric_ID не совпадает, будет показано соответствующее Metric_Data (имеется в виду то, которое имеет значение)
- Пожалуйста, обратите внимание, что в таблицах 1 и 2 существуют только некоторые общие и некоторые разные идентификаторы Metric_ID.
Как вы создаете эту 3-ю таблицу? Я перепробовал все виды объединений — полное, левое, правое и т.д.
Комментарии:
1. a. «Когда Metric_ID совпадет, будут добавлены Metric_Data» — Есть два поля metric_data. Какой из них следует добавить? Похоже, здесь было бы полезно привести пример.
2. Связаны ли две таблицы только по Metric_ID? Т.е. является ли «LocID» PK их соответствующих таблиц и, следовательно, не связан друг с другом или LocID также является объединяющим столбцом?
3. связаны LocID и Metric_ID; первичными ключами являются LocID, Metric_ID для одной таблицы и LocID, Prod_ID, Metric_ID для другой таблицы. Итоговая таблица должна содержать все четыре столбца, и Prod_ID не может быть нулевым или пустым в итоговой таблице
4. Что помогло бы больше всего, так это некоторые примеры входных данных и ожидаемые результаты.
5. Позвольте мне объяснить: предположим, мы производим продукты в разных местах. Существует прямая стоимость продукта (Prod_ID) и косвенная стоимость, которая является общей для всех продуктов, производимых в этом местоположении (LocID). Затраты разбиты на различные элементы (Metric_ID и Metric_Data). Я должен сообщить о конечной стоимости (прямые затраты косвенные затраты) по статьям затрат. Некоторые статьи затрат являются общими для обеих таблиц, а некоторые специфичны для каждой таблицы. Моя итоговая таблица должна включать все статьи затрат для продукта в местоположении, т. Е. она должна иметь LocID, Prod_ID который не может быть нулевым
Ответ №1:
Редактировать
select
A.LocID,
A.Prod_ID,
B.Metric_ID,
coalesce(C.Metric_Data D.Metric_Data, C.Metric_Data, D.Metric_Data) Metric_Data
from (
select LocID, Prod_ID from table1 group by LocID, Prod_ID) A
inner join (
select LocID, Metric_ID from table1 group by LocID
union
select LocID, Metric_ID from table2 group by LocID) B on A.LocID = B.LocID
left join table1 C on C.LocID = A.LocID and C.Prod_ID = A.Prod_ID and C.Metric_ID = B.Metric_ID
left join table2 D on D.LocID = A.LocID and D.Metric_ID = B.Metric_ID
Примечания:
- A: создает все комбинации location и ProdID
- B: создает для каждого местоположения все возможные идентификаторы метрик из обеих таблиц
- C и D: левые соединения с таблицами данных для получения данных метрики
- Coalesce: возвращает либо C D, либо, если одно из них равно null, возвращает другое
select
coalesce(a.LocID, b.LocID) LocID,
a.Prod_ID,
coalesce(a.Metric_ID, b.Metric_ID) Metric_ID,
coalesce(a.Metric_Data b.Metric_Data, a.Metric_Data, b.Metric_Data) Metric_Data
from table1 a
full outer join table2 b
on a.LocID = b.LocID and a.Metric_ID = b.Metric_ID
Это предполагает
- Выполняется сопоставление по кортежу (LocID, Metric_ID)
- Возможно, что либо A, либо B не имеют (LocID,Metric_ID), который существует в другом
- Результатом Metric_Data является либо A B (если оба существуют), либо A или B, если существует только одна комбинация (LocID, Metric_ID)
Комментарии:
1. Ричард, ты почти на месте — могу ли я получить Prod_ID для всех записей в итоговой таблице — идея в том, что конечные данные метрики относятся к продукту и представляют собой сумму продукта и местоположения. Таким образом, конечная таблица будет иметь LocID, Prod_ID, Metric_ID, Metric_Data, как вы указали, но Prod_ID не будет пустым — он всегда будет принимать значение, и ни одна строка данных объединенных таблиц (обеих) не будет опущена. Ваши предположения верны.
2. Запрос должен работать естественным образом, если на стороне A ВСЕГДА есть запись (для указания ProdID) — но если это условие верно, я бы использовал ЛЕВОЕ СОЕДИНЕНИЕ вместо ПОЛНОГО СОЕДИНЕНИЯ. Теперь, если (LocID, MetricID) существует в B, но НЕ в A, то откуда может взяться ProdID??
3. Рассмотрим это следующим образом — у меня есть таблица по Prod_ID, которая содержит определенные метрические данные. У меня есть другая таблица, которая содержит общие метрические данные и не предназначена для конкретного Prod_ID. Общей связью является LocID между двумя таблицами. Однако, возможно, не все метрические идентификаторы доступны в обеих таблицах. Но моей окончательной таблице нужны все метрические идентификаторы, как вы получили, но это также должно быть для Prod_ID. То, что у вас получилось, — это почти объединение, но я потерял несколько строк — теперь знаете, как. Спасибо Ричарду за помощь.
4. Итак, когда я добавляю строку общей метрики в строку метрики Prod_ID — я получаю окончательную метрику для Prod_ID. Вот почему моя итоговая таблица должна содержать Prod_ID и показатели для продуктов. Например, для производства — это прямые затраты на продукт, и есть косвенные затраты (которые являются общими для всех продуктов). Однако общая стоимость продукта равна его прямой стоимости косвенные затраты. Я должен сообщить общую стоимость продукта. LocID — это то место, где он создается. И MetricID — это разные статьи затрат, которые не всегда присутствуют в каждом конкретном случае. Надеюсь, это поможет.
5. Огромное тебе спасибо, Ричард — ты потрясающий — замечательный и быстрый ответ. Еще одна вещь — любой способ ускорить это — требует времени для получения результатов — у меня всего менее 5000 записей между двумя таблицами. Еще раз спасибо!