Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение таблиц  [new]
mbs92
Member

Откуда:
Сообщений: 18
Здравствуйте, такой вопрос.
Есть Table1, в которую каждый день в 9 утра записываются 4 строчки с данными, ее вид:
id
Name
Kolvo
Price
Date

И есть Table2, в которую каждый день в 9 утра записывается одна строчка с данными, ее вид:
id
Marka
Znachenie
Date

Можно ли обьединить таблицы таким образом, чтобы строчки из Table2, объединялись с первой из четырёх строк Table1?
Примерно так:

id name kolvo price marka znachenie date
1. M1. 100. 250. P1. 6000. 06-08-2018
2. M2. 140. 250. Null. Null. Null
3. M3. 301. 350. Null. Null. Null
4. M4. 400. 900. Null. Null. Null
5. M1. 100. 250. P1. 8000. 07-08-2018
6. M2. 140. 250. Null. Null. Null
7. M3. 301. 350. Null. Null. Null
8. M4. 400. 900. Null. Null. Null
6 авг 18, 22:51    [21632258]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31326
mbs92
Можно ли обьединить таблицы таким образом, чтобы строчки из Table2, объединялись с первой из четырёх строк Table1?
Да, кросс-джойн с топ 1 из Table1
6 авг 18, 23:44    [21632276]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
mbs92
Member

Откуда:
Сообщений: 18
alexeyvg,

Поправьте если я не прав, но ведь при данном запросе строка из второй таблицы, все время будет объединятся тупо с первой строкой из table1?
А мне нужно чтобы новая строчка из table2 объединялась с каждой четвёртой из table1
7 авг 18, 00:29    [21632289]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31326
mbs92
Поправьте если я не прав, но ведь при данном запросе строка из второй таблицы, все время будет объединятся тупо с первой строкой из table1?
Да. Вы же хотите, цитирую: "чтобы строчки из Table2, объединялись с первой из четырёх строк Table1"?
mbs92
А мне нужно чтобы новая строчка из table2 объединялась с каждой четвёртой из table1
Это тоже не очень понятная формулировка :-)
7 авг 18, 01:51    [21632309]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
mbs92
А мне нужно чтобы новая строчка из table2 объединялась с каждой четвёртой из table1


Тогда это выглядит вот так:
id name kolvo price marka znachenie date
1 M1 100 250 P1 6000 06-08-2018
2 M2 140 250 P1 6000 06-08-2018
3 M3 301 350 P1 6000 06-08-2018
4M4 400 900 P1 6000 06-08-2018
5 M1 100 250 P1 8000 07-08-2018
6 M2 140 250 P1 8000 07-08-2018
7 M3 301 350 P1 8000 07-08-2018
8 M4 400 900 P1 8000 07-08-2018
7 авг 18, 02:57    [21632324]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Вру. это полное объединение.

mbs92
Можно ли обьединить таблицы таким образом, чтобы строчки из Table2, объединялись с первой из четырёх строк Table1?

mbs92
А мне нужно чтобы новая строчка из table2 объединялась с каждой четвёртой из table1


Так с первой или с четвертой?

Впрочем без разницы.
Объединение с условием name="M1" (если с первой) или name="M4" если с четвертой
+ union all с фильтром по первой таблице name<>="M1"(если с первой) или name<>"M4" если с четвертой

И не забыть добавить недостающие поля
7 авг 18, 03:06    [21632326]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
"В лоб" получилось вот так


SELECT table1.ID, table1.name ,table1.KOLVO, table1.PRICE,
       table2.marka, table2.znachenie, table1.date
FROM TABLE1, TABLE2
  WHERE TABLE1.NAME='M1' AND TABLE1.DATE=TABLE2.DATE
union all
SELECT table1.ID, table1.name ,table1.KOLVO, table1.PRICE,
       null as marka, null as znachenie, null as date
FROM TABLE1 
  WHERE TABLE1.NAME<>'M1' 
  order by table1.ID


http://sqlfiddle.com/#!18/bd2a7/16

но явно тут что-то не так с постановкой.
ибо теряем дату в остальных строках
7 авг 18, 03:44    [21632331]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
mbs92,

нумеруете обе выборки при помощи ROW_NUBER() OVER() (если в ID гарантированно нет пропусков - можете использовать его, но лучше перестраховаться),
лево-СОЕДИНЯЕТЕ полученный наборы данных (от первой таблице - ко второй) по полю-нумератору и MOD-у + целочисленному делению на 4:
with
  xT1 as 
    (
      select t.*, row_number() over(order by id) as rn from table1 t
    )
, xT2 as 
    (
      select t.*, row_number() over(order by id) as rn from table2 t
    )
select *
 from xT1
 left join xT2
   on xT1.rn/4 + 1 = xT2.rn
  and xT1.rn%4 = 1


тестовые данные и проверка
7 авг 18, 04:36    [21632337]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Согласен, с left join правильнее.

select table1.ID, table1.name ,table1.KOLVO, table1.PRICE,
       table2.marka, table2.znachenie, table2.date
 from table1 
 left join table2
   on table1.date = table2.date
  and table1.name= 'M1'
7 авг 18, 05:19    [21632339]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
mbs92
Member

Откуда:
Сообщений: 18
982183,

Получилось так как вы сказали, но если за одну дату несколько записей, то начинается дублирование строк. Можно как то исправить запрос, чтобы дублирования не было?
24 сен 18, 12:38    [21683812]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Сначала надо понять, какие данные за один день данных надо оставить.
24 сен 18, 13:26    [21683904]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Или просто объясни, что ты хочешь видеть в конечных результатах.

http://sqlfiddle.com/#!18/07240/1
25 сен 18, 04:26    [21684866]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Дубли у тебя в Table1 или в Table2?
Или в обоих?
27 сен 18, 04:42    [21687648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить