powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединить две таблицы в одну
17 сообщений из 17, страница 1 из 1
Объединить две таблицы в одну
    #40080807
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется две таблицы. Первая показывает длительность рабочего дня. Вторая длительность обеда.
Вопрос: как объеденить две таблицы в одну, что бы показывало столбцы: Фамилия, Имя, Отчество, ВремяПрихода, ВремяУхода, ДлительностьРабочегоДня, ДлительностьОбеда?

Первая таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT staff.surname as 'Фамилия', name as 'Имя', patronymic as 'Отчество', t.date as 'ВремяПрихода', t.ВремяУхода, CONVERT(VARCHAR(8),DATEADD(MINUTE,(SUM(DATEDIFF(MINUTE,t.date,t.ВремяУхода))), 0),108) ДлительностьРабочегоДня
  FROM (SELECT r.id_staff,r.date,
           (SELECT MIN(u.date) date 
              FROM urv u 
              WHERE u.id_staff=r.id_staff AND 
                    u.id_act=N'6' AND
                    u.date > r.date) AS ВремяУхода
          FROM urv r
          WHERE r.id_act=N'0' AND 
                r.date>=dateadd(dd, -60, convert(date, getdate())) AND 
                r.date<dateadd(dd, 1, convert(date, getdate()))) t
                inner join staff on staff.id_staff=t.id_staff
  GROUP BY t.id_staff, date, ВремяУхода, surname, name, patronymic order by  t.date



Вторая таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT staff.surname as 'Фамилия', name as 'Имя', patronymic as 'Отчество', t.date as 'Обед С', t.Обед_до, CONVERT(VARCHAR(8),DATEADD(MINUTE,(SUM(DATEDIFF(MINUTE,t.date,t.Обед_до))), 0),108) ДлительностьОбеда
  FROM (SELECT r.id_staff,r.date,
           (SELECT MIN(u.date) date 
              FROM urv u 
              WHERE u.id_staff=r.id_staff AND 
                    
                    u.date > r.date) AS Обед_до
          FROM urv r
          WHERE r.id_act=N'5' AND 
                r.date>=dateadd(dd, -60, convert(date, getdate())) AND 
                r.date<dateadd(dd, 1, convert(date, getdate()))) t
                inner join staff on staff.id_staff=t.id_staff
  GROUP BY t.id_staff, date, Обед_до, surname, name, patronymic order by  t.date
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080811
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Join не подойдет?
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080815
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kaktyc007,

сделать подзапросом, только вытащить t.id_staff как связующий элемент и фильтр по Тор 1 дату начала обеда между датой прихода и датой ухода
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080947
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,это как?
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080976
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaktyc007,

Для начала выучите основы баз данных. Например, что такое ключи и что такое 3 нормальная форма 3ТА. У вас там есть id_staff. Вы его выкидываете, а потом с круглыми глазами спрашиваете: "а как объединить?!... а...?" Вот по нему и объединяют данные. А если у вас там однофамильцы? А если, кто выйдет замуж и сменит фамилию? Вы как поймете, что это тот же человек.

Не надо только сейчас тут слезы лить. Надо элементарные вещи про то, что такое База данных посмотреть, и все сразу станет на свои мета.
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080979
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

к чему весь этот пафос?

Kaktyc007,
можно так попробовать. а если у ОбедДо свой тип, то можно упростить.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT r.id_staff,r.date, r2.[ОбедС],r3.[ОбедДо],r2.[ВремяУхода] 
  FROM urv r
 cross apply(select min(case when r2.id_act=N'6' then r2.date end) as [ВремяУхода]
                   ,min(case when r2.id_act=N'5' then r2.date end) as [ОбедС] 
               from urv r2
              where r2.id_staff=r.id_staff
                and r2.Date>r.Date) r2
 cross apply(select min(r3.date) as [ОбедДо]
               from urv r3
              where r3.id_staff=r.id_staff
                and r3.Date>r2.[ОбедС]) r2
 WHERE r.id_act=N'0' 
   AND r.date>=dateadd(dd, -60, convert(date, getdate())) 
   AND r.date<dateadd(dd, 1, convert(date, getdate()))
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080980
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дубль
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080984
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, необходимо, чтобы были столбцы: Фамилия, Имя, Отчество, ВремяПрихода, ВремяУхода, ДлительностьРабочегоДня, ДлительностьОбеда
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40080999
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaktyc007,

что то мешает это обеспечить?
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081002
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, не получается. Единственной получилось добавить столбец, но он у всех записей выводит длительность обеда
скрин: https://ibb.co/F62rsbx
Вот сам код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT staff.surname as 'Фамилия', staff.name as 'Имя', staff.patronymic as 'Отчество', t.date as 'ВремяПрихода', t.ВремяУхода, CONVERT(VARCHAR(8),DATEADD(MINUTE,(SUM(DATEDIFF(MINUTE,t.date,t.ВремяУхода))), 0),108) ДлительностьРабочегоДня, CONVERT(VARCHAR(8),DATEADD(MINUTE,(SUM(DATEDIFF(MINUTE,e.date,e.Обед_до))), 0),108) ДлительностьОбеда
  FROM (SELECT r.id_staff,r.date,
           (SELECT MIN(u.date) date 
              FROM urv u 
              WHERE u.id_staff=r.id_staff AND 
                    u.id_act=N'6' AND
                    u.date > r.date) AS ВремяУхода
          FROM urv r
          WHERE r.id_act=N'0' AND 
                r.date>=dateadd(dd, -60, convert(date, getdate())) AND 
                r.date<dateadd(dd, 1, convert(date, getdate()))) [t] inner join staff on staff.id_staff=t.id_staff,
                (SELECT q.id_staff,q.date,
           (SELECT MIN(w.date) date 
              FROM urv w 
              WHERE w.id_staff=q.id_staff AND 
                    
                    w.date > q.date) AS Обед_до
          FROM urv q
          WHERE q.id_act=N'5' AND 
                q.date>=dateadd(dd, -60, convert(date, getdate())) AND 
                q.date<dateadd(dd, 1, convert(date, getdate()))) e
                left join staff s on s.id_staff=e.id_staff
  GROUP BY [t].id_staff, t.date, ВремяУхода, staff.surname, staff.name, staff.patronymic order by  t.date
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081011
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaktyc007,

а что вы сделали?
сделали кросс-джоин двух своих запросов что ли?
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081014
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT r.id_staff,s.surname,s.name,s.patronymic
      ,r.date as [ВремяПрихода], r2.[ОбедС],r3.[ОбедДо],r2.[ВремяУхода] 
      ,convert(char(8),r2.[ВремяУхода]-r.date,8) [ДлительностьРабочегоДня]
      ,convert(char(8),r3.[ОбедДо]-r2.ОбедС,8) [ДлительностьОбеда]
  FROM urv r
 cross apply(select min(case when r2.id_act=N'6' then r2.date end) as [ВремяУхода]
                   ,min(case when r2.id_act=N'5' then r2.date end) as [ОбедС] 
               from urv r2
              where r2.id_staff=r.id_staff
                and r2.Date>r.Date) r2
 cross apply(select min(r3.date) as [ОбедДо]
               from urv r3
              where r3.id_staff=r.id_staff
                and r3.Date>r2.[ОбедС]) r3
  join staff s
    on s.id_staff = r.id_staff
 WHERE r.id_act=N'0' 
   AND r.Date>=dateadd(dd, -60, convert(date, getdate())) 
   AND r.Date<dateadd(dd, 1, convert(date, getdate()))
 order by r.Date  
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081016
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, большое спасибо!
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081058
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, только не совсем корректно, обед выводиться и в другие даты, к примеру 25.06 вышел обед за 29.06, как это исправить?
скрин: https://ibb.co/crGScPQ
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081065
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaktyc007,
видимо, добавить условие в запрос.
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081073
Kaktyc007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, это да, но как? У меня получается либо у всех выводить одно и тоже время, либо вообще ничего не выводиться
...
Рейтинг: 0 / 0
Объединить две таблицы в одну
    #40081074
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kaktyc007,

я без понятия, что там у вас в общем случае может быть с данными.
например, может ли быть окончание работы не в тот же день, что и начало.
если нет, можно добавить внутрь r2 условие
Код: sql
1.
and r2.Date<dateadd(dd,1,cast(r.Date as date))
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединить две таблицы в одну
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]