Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединить две таблицы в одну / 17 сообщений из 17, страница 1 из 1
29.06.2021, 21:36
    #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
29.06.2021, 22:03
    #40080811
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Join не подойдет?
...
Рейтинг: 0 / 0
29.06.2021, 22:34
    #40080815
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Kaktyc007,

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

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

Не надо только сейчас тут слезы лить. Надо элементарные вещи про то, что такое База данных посмотреть, и все сразу станет на свои мета.
...
Рейтинг: 0 / 0
30.06.2021, 16:01
    #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
30.06.2021, 16:01
    #40080980
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
дубль
...
Рейтинг: 0 / 0
30.06.2021, 17:10
    #40080984
Kaktyc007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Посетитель, необходимо, чтобы были столбцы: Фамилия, Имя, Отчество, ВремяПрихода, ВремяУхода, ДлительностьРабочегоДня, ДлительностьОбеда
...
Рейтинг: 0 / 0
30.06.2021, 18:07
    #40080999
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Kaktyc007,

что то мешает это обеспечить?
...
Рейтинг: 0 / 0
30.06.2021, 18:29
    #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
30.06.2021, 19:03
    #40081011
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Kaktyc007,

а что вы сделали?
сделали кросс-джоин двух своих запросов что ли?
...
Рейтинг: 0 / 0
30.06.2021, 19:28
    #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
30.06.2021, 19:34
    #40081016
Kaktyc007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Посетитель, большое спасибо!
...
Рейтинг: 0 / 0
01.07.2021, 08:02
    #40081058
Kaktyc007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Посетитель, только не совсем корректно, обед выводиться и в другие даты, к примеру 25.06 вышел обед за 29.06, как это исправить?
скрин: https://ibb.co/crGScPQ
...
Рейтинг: 0 / 0
01.07.2021, 09:06
    #40081065
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Kaktyc007,
видимо, добавить условие в запрос.
...
Рейтинг: 0 / 0
01.07.2021, 10:32
    #40081073
Kaktyc007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Посетитель, это да, но как? У меня получается либо у всех выводить одно и тоже время, либо вообще ничего не выводиться
...
Рейтинг: 0 / 0
01.07.2021, 10:36
    #40081074
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить две таблицы в одну
Kaktyc007,

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


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