Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
6 авг 18, 23:44 [21632276] Ответить | Цитировать Сообщить модератору |
mbs92 Member Откуда: Сообщений: 18 |
alexeyvg, Поправьте если я не прав, но ведь при данном запросе строка из второй таблицы, все время будет объединятся тупо с первой строкой из table1? А мне нужно чтобы новая строчка из table2 объединялась с каждой четвёртой из table1 |
7 авг 18, 00:29 [21632289] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
7 авг 18, 01:51 [21632309] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Тогда это выглядит вот так:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 авг 18, 02:57 [21632324] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Вру. это полное объединение.
Так с первой или с четвертой? Впрочем без разницы. Объединение с условием name="M1" (если с первой) или name="M4" если с четвертой + union all с фильтром по первой таблице name<>="M1"(если с первой) или name<>"M4" если с четвертой И не забыть добавить недостающие поля |
||||
7 авг 18, 03:06 [21632326] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
"В лоб" получилось вот так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] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
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] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Согласен, с 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] Ответить | Цитировать Сообщить модератору |
mbs92 Member Откуда: Сообщений: 18 |
982183, Получилось так как вы сказали, но если за одну дату несколько записей, то начинается дублирование строк. Можно как то исправить запрос, чтобы дублирования не было? |
24 сен 18, 12:38 [21683812] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Сначала надо понять, какие данные за один день данных надо оставить. |
24 сен 18, 13:26 [21683904] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Или просто объясни, что ты хочешь видеть в конечных результатах. http://sqlfiddle.com/#!18/07240/1 |
25 сен 18, 04:26 [21684866] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Дубли у тебя в Table1 или в Table2? Или в обоих? |
27 сен 18, 04:42 [21687648] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |