Вход | Регистрация



Задачка на запросы

Задачка на запросы
Я
   1cmag
 
21.11.18 - 14:08
Уже более 10 лет в профессии и при очередном собеседовании на новое место работы дали задачку. Сказали решил неправильно. Настолько "снесли корону", что я от смущения завел новый аккаунт на мисте, чтобы не палить основной. Подскажите, что не так?

Имеются две таблицы
Таблица1
Фамилия Цех НормаЧасов
Иванов Цех сборки 50
Петров Цех покраски 30
Сидоров Цех обработки 40
Иванов Цех литья 100
Иванов Цех ковки 80

Таблица2
Фамилия Цех НормаЧасов
Иванов Цех сборки 75
Петров Цех сборки 30
Сидоров Цех обработки 35
Кузнецов Цех ковки 150

Результирующая таблица
Фамилия Цех НормаЧасов
Иванов Цех сборки 75
Петров Цех покраски 30
Петров Цех сборки 30
Сидоров Цех обработки 35
Иванов Цех литья 100
Иванов Цех ковки 80

Необходимо запросом получить из первых двух таблиц третью
Если строки первой и второй таблицы совпадают по Фамилии и Цеху то взять нормочасы из второй таблицы
Если не совпадают по цеху, то вся строка попадает в результирующую таблицу
Если фамилия есть только в одной таблице, а в другой ее нет, то такая строка не попадает в результирующую таблицу
 
 
   1cmag
 
1 - 21.11.18 - 14:08
ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    50 КАК НормаЧасов
ПОМЕСТИТЬ Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    "Цех покраски",
    30

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    40

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Иванов",
    "Цех литья",
    100

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Иванов",
    "Цех ковки",
    80
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    75 КАК НормаЧасов
ПОМЕСТИТЬ Таблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    "Цех сборки",
    30

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    35

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Кузнецов",
    "Цех ковки",
    150
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия,
    ВЫБОР
        КОГДА Таблица1.Цех ЕСТЬ NULL
            ТОГДА Таблица2.Цех
        ИНАЧЕ Таблица1.Цех
    КОНЕЦ КАК Цех,
    ВЫБОР
        КОГДА Таблица1.Цех ЕСТЬ NULL
            ТОГДА Таблица2.НормаЧасов
        КОГДА Таблица2.Цех ЕСТЬ NULL
            ТОГДА Таблица1.НормаЧасов
        ИНАЧЕ Таблица2.НормаЧасов
    КОНЕЦ КАК НормаЧасов
ИЗ
    Таблица1 КАК Таблица1
        ПОЛНОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
            И Таблица1.Цех = Таблица2.Цех
ГДЕ
    НЕ Таблица1.Фамилия ЕСТЬ NULL

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Таблица2.Фамилия,
    Таблица2.Цех,
    Таблица2.НормаЧасов
ИЗ
    Таблица2 КАК Таблица2
        ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1
        ПО (Таблица1.Фамилия = Таблица2.Фамилия)
            И (Таблица1.Цех = Таблица2.Цех)
ГДЕ
    Таблица2.Фамилия В
            (ВЫБРАТЬ
                Таблица1.Фамилия
            ИЗ
                Таблица1 КАК Таблица1)
    И Таблица1.Фамилия ЕСТЬ NULL
   onetone
 
2 - 21.11.18 - 14:12
Может это новый метод слива кандидатов?))
   Aceforg
 
3 - 21.11.18 - 14:36
(0)
Если во второй таблице будет запись Иванов Цех обработки, то он не попадет в результирующую таблица - это не верно

Вообще, зачем так писать. Через несколько дней уже не поймешь что этот запрос делает.
   evorle145
 
4 - 21.11.18 - 14:40
(3) С чего ты это взял. Попадет.
   0
 
5 - 21.11.18 - 14:40
А что значит "сказали, что решил неправильно".
Самостоятельно то не понять - правильно или нет?
   0
 
6 - 21.11.18 - 14:42
"Если не совпадают по цеху, то вся строка попадает в результирующую таблицу "

Тут даже условие непонятно нифига. По-русски то писать не умеют? Какая "вся строка", если речь про ДВЕ таблицы?
   Digger
 
7 - 21.11.18 - 14:50
(6) ну вот я как раз не вижу как это условие выполняется в запросе.  )     когда фамилии совпали, а цеха нет.  то записи из второй таблицы не подтянутся.
   1cmag
 
8 - 21.11.18 - 14:54
(7) это реализовано во втором запросе объединения. С помощью него подтягиваю запись Таблицы2
Петров Цех сборки 30
   Вафель
 
9 - 21.11.18 - 14:55
через объединить находишь все фио+цех + соединение 1 таблицы и 2
   Вафель
 
10 - 21.11.18 - 14:55
хотя нет не так
 
 Рекламное место пустует
   1cmag
 
11 - 21.11.18 - 14:56
(6) это я перекаверкал. Имеется в виду если фамилия совпадает, а цех нет, то в результирующий запрос должны попасть все строки и из первой и из второй таблицы.
   andreymongol82
 
12 - 21.11.18 - 14:57
По-моему в последней таблице надо не левое, а полное соединение
   andreymongol82
 
13 - 21.11.18 - 14:58
И соответственно на NULL проверять записи обоих таблиц
   youalex
 
14 - 21.11.18 - 14:59
выбрать Таблица1.Фамилия, Таблица1.Цех, Таблица2.НормаЧасов 
    из Таблица1  
    СОЕДИНЕНИЕ  Таблица2 ПО Таблица1.Фамилия =  Таблица2.Фамилия И Таблица1.Цех = Таблица2.Цех
     ОБЪЕДИНИТЬ 
    выбрать Таблица1.Фамилия, Таблица1.Цех, Таблица1.НормаЧасов 
    из Таблица1  
    СОЕДИНЕНИЕ  Таблица2 ПО Таблица1.Фамилия =  Таблица2.Фамилия И Таблица1.Цех <> Таблица2.Цех
    ОБЪЕДИНИТЬ 
    выбрать Таблица1.Фамилия, Таблица2.Цех, Таблица2.НормаЧасов 
    из Таблица1  
    СОЕДИНЕНИЕ  Таблица2 ПО Таблица1.Фамилия =  Таблица2.Фамилия И Таблица1.Цех <> Таблица2.Цех
   1cmag
 
15 - 21.11.18 - 15:01
(12) а для какого примера запрос не отработает корректно?
   1cmag
 
16 - 21.11.18 - 15:08
(14) похоже я сильно перемудрил. спасибо. очень четко и лаконично.
   VS-1976
 
17 - 21.11.18 - 15:09
(0) Волшебник перелогинься :)
   youalex
 
18 - 21.11.18 - 15:13
(14) + можно еще сократить (наверное) благодаря условию "...то взять нормочасы из второй таблицы":

    выбрать Таблица1.Фамилия, Таблица1.Цех, ВЫБОР КОГДА Таблица1.Цех =  Таблица2.Цех ТОГДА Таблица2.НормаЧасов ИНАЧЕ Таблица1.НормаЧасов КОНЕЦ  КАК  НормаЧасов 
    из Таблица1  
    СОЕДИНЕНИЕ  Таблица2 ПО Таблица1.Фамилия =  Таблица2.Фамилия
    объединить 
    выбрать Таблица1.Фамилия, Таблица2.Цех, Таблица2.НормаЧасов
    из Таблица1  
    СОЕДИНЕНИЕ  Таблица2 ПО Таблица1.Фамилия =  Таблица2.Фамилия
   andreymongol82
 
19 - 21.11.18 - 15:14
(15) Пардон, не весь текст проглядел внимательно проглядел
   VS-1976
 
20 - 21.11.18 - 15:31
(18) Ты уверен за результат?
   youalex
 
21 - 21.11.18 - 15:35
(20) Вполне. Тебя что-то смущает?
   Deon
 
22 - 21.11.18 - 15:42
(14) (18) Добавь во вторую таблицу
Иванов Цех литья 99
   singlych
 
23 - 21.11.18 - 15:42
(0) Если будет фамилия в Т1, но не будет в Т2, то у тебя она попадет в результирующую.
   VS-1976
 
24 - 21.11.18 - 15:43
(21) Ты думаешь что в таблицах по одной совпадающей записи Фамилия, Цех? Или есть случаи. Решив тупо задачу "в лоб" могут сказать, что фантазия у тебя не работает и ты не дуешь на воду

Таблица1
Фамилия1, Цех1, НормаЧасов1

Таблица2
Фамилия1, Цех1, НормаЧасов2
Фамилия1, Цех1, НормаЧасов3
   Deon
 
25 - 21.11.18 - 15:44
(24) Даже интересно, какие в этом случае нормочасы должны попасть в результирующую таблицу?
   VS-1976
 
26 - 21.11.18 - 15:46
(25) Там должно быть поле период, и добавляется блок нахождения последнего
   evorle145
 
27 - 21.11.18 - 16:02
(14) (18) , если добавить Добавь во вторую таблицу
Иванов Цех литья 99 то тогда в результирующую таблицу попадут две строки:
Иванов Цех литья 99
Иванов Цех литья 100

а по условию задачи должна попасть только строка
Иванов Цех литья 99
   youalex
 
28 - 21.11.18 - 16:04
(22) (24)
И что неправильно. По условию "Если строки первой и второй таблицы совпадают по Фамилии и Цеху то взять нормочасы из второй таблицы" Если во второй таблице два значения - будет две строки.

(27) почему это только одна строка.
Условию соответствуют две строки , и они обе попадут.
   youalex
 
29 - 21.11.18 - 16:05
(26) там нет поля период.
   VS-1976
 
30 - 21.11.18 - 16:08
(29) Да, но у меня был случай, когда нужно было догадаться :)
   Deon
 
31 - 21.11.18 - 16:09
(28) Условию как раз соответствует только вторая строка с 99 часов. Перечитай внимательнее
   evorle145
 
32 - 21.11.18 - 16:10
(28) "Если строки первой и второй таблицы совпадают по Фамилии и Цеху то взять нормочасы из второй таблицы"
строки
Иванов Цех литья 99
Иванов Цех литья 100
совпадают по фамилии и цеху, а значит нужно взять нормочасы из второй таблицы.
То есть строку  "Иванов Цех литья 99" мы увидеть не должны.
   dezss
 
33 - 21.11.18 - 16:10
(23) +100500
 
 
   evorle145
 
34 - 21.11.18 - 16:15
(30) я понимаю, что ты усложняешь задачу, это хорошо. Но у нас до сих пор нет правильного решения в текущем ее виде.
   VS-1976
 
35 - 21.11.18 - 16:23
(34) Я немного накропал, может и ошибаюсь, шибко не думал, но примерно так:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Фамилия
ПОМЕСТИТЬ тзФамилии

ИЗ
    Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Фамилия
ИЗ
    Таблица2

СГРУППИРОВАТЬ ПО
    Фамилия
ИМЕЮЩИЕ
    КОЛИЧЕСТВО( Фамилия ) = 2
;


ВЫБРАТЬ
    1 КАК НомерТаблицы,
    Таблица1.*

ПОМЕСТИТЬ тзДанные

ИЗ
    тзФамилии

    СОЕДИНЕНИЕ Таблица1
        ПО Таблица1.Фамилия = тзФамилии

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    Таблица2.*
ИЗ
    тзФамилии

    СОЕДИНЕНИЕ Таблица2
        ПО Таблица2.Фамилия = тзФамилии

ИНДЕКСИРОВАТЬ ПО
    Фамилия,
    Цех    
;

ВЫБРАТЬ
    Фамилия,
    Цех
ПОМЕСТИТЬ тзЦех

ИЗ
    тзДанные

СГРУППИРОВАТЬ ПО
    Фамилия,
    Цех

ИМЕЮЩИЕ
    СУММА( РАЗЛИЧНЫЕ НомерТаблицы ) = 3
;

ВЫБРАТЬ
    Фамилия,
    Цех,
    МАКСИМУМ( НормаЧасов )  // Тут нужен алгоритм какой цифирь брать если во второй таблице несколько нормачасов 

ИЗ
    тзЦех
    
    ЛЕВОЕ СОЕДИНЕНИЕ тзДанные
        ПО тзДанные.Фамилия = тзЦех.Фамилия
         И тзДанные.Цех = тзЦех.Цех
         И тзДанные.НомерТаблицы = 2

СГРУППИРОВАТЬ ПО
    Фамилия,
    Цех

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Фамилия,
    Цех,
    НормаЧасов
ИЗ
    тзДанные
    
    ЛЕВОЕ СОЕДИНЕНИЕ тзЦех
        ПО тзДанные.Фамилия = тзЦех.Фамилия
         И тзДанные.Цех = тзЦех.Цех

ГДЕ
    тзЦех.Фамилия ЕСТЬ NULL
   VS-1976
 
36 - 21.11.18 - 16:27
(35) Первую часть не досмотрел, нужно так:

ВЫБРАТЬ
    Фамилия
ПОМЕСТИТЬ тзФамилии

ИЗ
    ( ВЫБРАТЬ РАЗЛИЧНЫЕ
        Фамилия
    ИЗ
        Таблица1

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ РАЗЛИЧНЫЕ
        Фамилия
    ИЗ
        Таблица2
    ) КАК Фамилии

СГРУППИРОВАТЬ ПО
    Фамилия
ИМЕЮЩИЕ
    КОЛИЧЕСТВО( Фамилия ) = 2
;

PS: Что бы несколько раз из физических таблиц не отбирать написал такой запрос,.. можно и по другому конечно
   Deon
 
37 - 21.11.18 - 16:44
(36) вот так попроще:
ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия
ПОМЕСТИТЬ ВТ_Фамилии
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
   Deon
 
38 - 21.11.18 - 16:45
(37) РАЗЛИЧНЫЕ, конечно, ещё
   VS-1976
 
39 - 21.11.18 - 16:48
(38) Соединение всегда тяжелее по затратам чем группировка, нужно и о производительности думать, хотя я там не шибко и думал, но просто привычка
   Deon
 
40 - 21.11.18 - 17:00
(39) Не знал, не знал
   Deon
 
41 - 21.11.18 - 17:02
(35) Попробовал проверить, куча лишних строк выдоло
   Deon
 
42 - 21.11.18 - 17:03
Я вот такой запрос набросал:
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Таблица1.Фамилия КАК Фамилия
ПОМЕСТИТЬ ВТ_Фамилии
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия,
    Таблица1.Цех КАК Цех,
    Таблица1.НормаЧасов КАК НормаЧасов1,
    NULL КАК НормоЧасов2
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    ВТ_Фамилии КАК ВТ_Фамилии
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1
        ПО (Таблица1.Фамилия = ВТ_Фамилии.Фамилия)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Таблица2.Фамилия,
    Таблица2.Цех,
    NULL,
    Таблица2.НормаЧасов
ИЗ
    ВТ_Фамилии КАК ВТ_Фамилии
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО (Таблица2.Фамилия = ВТ_Фамилии.Фамилия)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Данные.Фамилия КАК Фамилия,
    ВТ_Данные.Цех КАК Цех,
    ЕСТЬNULL(СУММА(ВТ_Данные.НормоЧасов2), СУММА(ВТ_Данные.НормаЧасов1)) КАК НормоЧасов
ИЗ
    ВТ_Данные КАК ВТ_Данные

СГРУППИРОВАТЬ ПО
    ВТ_Данные.Фамилия,
    ВТ_Данные.Цех

   FormatC
 
43 - 21.11.18 - 17:06
тут нужен Вася, чтобы задачу решить...
но он заявление написал )))))))))))))
   KSN
 
44 - 21.11.18 - 17:21
(0) Решать задачки на собеседованиях можно только падаванам, уже поэтому тебя отбраковали.
   azernot
 
45 - 21.11.18 - 17:22
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия,
    Таблица1.Цех КАК Цех,
    Таблица2.НормаЧасов КАК НормаЧасов
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
            И Таблица1.Цех = Таблица2.Цех

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Таблица1.Фамилия,
    Таблица1.Цех,
    Таблица1.НормаЧасов
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
            И (НЕ Таблица1.Цех = Таблица2.Цех)
        ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК ТаблицаПолнойПроверки
        ПО Таблица1.Цех = ТаблицаПолнойПроверки.Цех
            И Таблица1.Фамилия = ТаблицаПолнойПроверки.Фамилия
ГДЕ
    ТаблицаПолнойПроверки.Фамилия ЕСТЬ NULL

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Таблица2.Фамилия,
    Таблица2.Цех,
    Таблица2.НормаЧасов
ИЗ
    Таблица2 КАК Таблица2
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1
        ПО Таблица2.Фамилия = Таблица1.Фамилия
            И (НЕ Таблица2.Цех = Таблица1.Цех)
        ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК ТаблицаПолнойПроверки
        ПО Таблица2.Цех = ТаблицаПолнойПроверки.Цех
            И Таблица2.Фамилия = ТаблицаПолнойПроверки.Фамилия
ГДЕ
    ТаблицаПолнойПроверки.Фамилия ЕСТЬ NULL
   Deon
 
46 - 21.11.18 - 17:26
(45) А работает )
   Ботаник Гарден Меран
 
47 - 21.11.18 - 17:33
ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    50 КАК НормаЧасов
ПОМЕСТИТЬ ВТ_1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Петров",
    "Цех покраски",
    30

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    40

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Иванов",
    "Цех литья",
    100

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Иванов",
    "Цех ковки",
    80
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    75 КАК НормаЧасов
ПОМЕСТИТЬ ВТ_2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Петров",
    "Цех сборки",
    30

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    35

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Кузнецов",
    "Цех ковки",
    150
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_1.Фамилия КАК Фамилия
ПОМЕСТИТЬ ВТ_Фамилии
ИЗ
    ВТ_1 КАК ВТ_1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
        ПО ВТ_1.Фамилия = ВТ_2.Фамилия
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЕСТЬNULL(ВТ_2.Фамилия, ВТ_1.Фамилия) КАК Фамилия,
    ЕСТЬNULL(ВТ_2.Цех, ВТ_1.Цех) КАК Цех,
    ЕСТЬNULL(ВТ_2.НормаЧасов, ВТ_1.НормаЧасов) КАК НормаЧасов
ПОМЕСТИТЬ ВТ_Полуфинал
ИЗ
    ВТ_1 КАК ВТ_1
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
        ПО ВТ_1.Фамилия = ВТ_2.Фамилия
            И ВТ_1.Цех = ВТ_2.Цех
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Полуфинал.Фамилия КАК Фамилия,
    ВТ_Полуфинал.Цех КАК Цех,
    ВТ_Полуфинал.НормаЧасов КАК НормаЧасов
ИЗ
    ВТ_Фамилии КАК ВТ_Фамилии
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Полуфинал КАК ВТ_Полуфинал
        ПО ВТ_Фамилии.Фамилия = ВТ_Полуфинал.Фамилия
   Ботаник Гарден Меран
 
48 - 21.11.18 - 17:34
ВТ_1 и ВТ_2 - таблицы из задания


////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_1.Фамилия КАК Фамилия
ПОМЕСТИТЬ ВТ_Фамилии
ИЗ
    ВТ_1 КАК ВТ_1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
        ПО ВТ_1.Фамилия = ВТ_2.Фамилия
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЕСТЬNULL(ВТ_2.Фамилия, ВТ_1.Фамилия) КАК Фамилия,
    ЕСТЬNULL(ВТ_2.Цех, ВТ_1.Цех) КАК Цех,
    ЕСТЬNULL(ВТ_2.НормаЧасов, ВТ_1.НормаЧасов) КАК НормаЧасов
ПОМЕСТИТЬ ВТ_Полуфинал
ИЗ
    ВТ_1 КАК ВТ_1
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
        ПО ВТ_1.Фамилия = ВТ_2.Фамилия
            И ВТ_1.Цех = ВТ_2.Цех
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Полуфинал.Фамилия КАК Фамилия,
    ВТ_Полуфинал.Цех КАК Цех,
    ВТ_Полуфинал.НормаЧасов КАК НормаЧасов
ИЗ
    ВТ_Фамилии КАК ВТ_Фамилии
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Полуфинал КАК ВТ_Полуфинал
        ПО ВТ_Фамилии.Фамилия = ВТ_Полуфинал.Фамилия
   VS-1976
 
49 - 21.11.18 - 18:59
(41) Возможно, я набросал примерно не проверял, нужно конечно с данными прогнать, возможно где-то и ошибся
 
 Рекламное место пустует
   jsmith82
 
50 - 21.11.18 - 19:04
(0) Иванов Цех сборки 50 + Иванов Цех сборки 75 = Иванов Цех сборки 75
Сидоров Цех обработки 40 + Сидоров Цех обработки 35 = Сидоров Цех обработки 35
Где логика? По цеху сборки максимум, по цеху обработки - минимум?
   azernot
 
51 - 21.11.18 - 20:39
(50) Если бы задача была сформулирована в прикладной терминологии, безусловно, было бы легче.
А так, можно только предполагать, какая прикладаная логика может крыться за такой постановкой задачи.
Собственно поэтому, лично я терпеть не могу такие вот "абстрактные" задачи, особенно, если их формулировка не идеальна.
   sergeyspb13
 
52 - 21.11.18 - 21:19
ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия,
    Таблица1.Цех КАК Цех,
    ВЫБОР
      КОГДА Таблица1.Цех = Таблица2.Цех
      ТОГДА Таблица2.НормаЧасов
      ИНАЧЕ Таблица1.НормаЧасов
    КОНЕЦ КАК НормаЧасов
ИЗ
    Таблица1 КАК Таблица1
        ПОЛНОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
   Cyberhawk
 
53 - 21.11.18 - 21:45
Сколько предлагали за решение вопроса?
   _Дайвер_
 
54 - 22.11.18 - 00:16
Отшили не потому что, не решил, а потому что железно решил.
Если фамилии будут другие, или названия цехов, каждый раз запрос будешь переписывать?
   assasu
 
55 - 22.11.18 - 04:25
(0)[Уже более 10 лет в профессии] - разговариваешь значит не убедительно. после 10 лет такие задачки не должны задавать.
   Fram
 
56 - 22.11.18 - 07:12
(54) мдэ..
   Fram
 
57 - 22.11.18 - 07:15
(0) может уже было, все не читал.
- внутренним соединением получить таблицу фамилий, которые есть в обеих таблицах
- полным соединением по фамилиям и цехам получить по условию кол-во и взять только фамилии из таблицы общих фамилий, полученных предыдущим запросом
   evorle145
 
58 - 22.11.18 - 08:21
(54) ты угораешь что ли? (56) надеюсь он угорает, иначе...
   evorle145
 
59 - 22.11.18 - 08:38
(0) держи верное решение:
Соединяем 3 таблицы:
таблица_А - это те строки которые совпали по фио и цеху и берем нормчас и таб2

таблица_В - это те строки из исходной таблицы 1, которых нет в таблица_А и разумеется отбросим фио, которых нет ни в одной из исходных таблиц
таблица_С - это те строки из исходной таблицы 2, которых нет в таблица_А и разумеется отбросим фио, которых нет ни в одной из исходных таблиц

Ниже сам запрос:
   evorle145
 
60 - 22.11.18 - 08:39
ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    50 КАК НормаЧасов
ПОМЕСТИТЬ Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    "Цех покраски",
    30

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    40

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Иванов",
    "Цех литья",
    100

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Иванов",
    "Цех ковки",
    80
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    "Иванов" КАК Фамилия,
    "Цех сборки" КАК Цех,
    75 КАК НормаЧасов
ПОМЕСТИТЬ Таблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петров",
    "Цех сборки",
    30

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Сидоров",
    "Цех обработки",
    35

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Кузнецов",
    "Цех ковки",
    150
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица2.Фамилия,
    Таблица2.Цех,
    Таблица2.НормаЧасов
ПОМЕСТИТЬ ТаблицаТехГдеЦехИФИОСовпали
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
            И Таблица1.Цех = Таблица2.Цех
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица1.Фамилия
ПОМЕСТИТЬ ТаблицаФИОКоторыеЕстьВОбоихТаблицах
ИЗ
    Таблица1 КАК Таблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
        ПО Таблица1.Фамилия = Таблица2.Фамилия
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица1.Фамилия,
    Таблица1.Цех,
    Таблица1.НормаЧасов
ПОМЕСТИТЬ СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху
ИЗ
    Таблица1 КАК Таблица1
ГДЕ
    Таблица1.Фамилия В
            (ВЫБРАТЬ
                ТаблицаФИОКоторыеЕстьВОбоихТаблицах.Фамилия
            ИЗ
                ТаблицаФИОКоторыеЕстьВОбоихТаблицах КАК ТаблицаФИОКоторыеЕстьВОбоихТаблицах)
    И НЕ (Таблица1.Фамилия, Таблица1.Цех) В
                (ВЫБРАТЬ
                    ТаблицаТехГдеЦехИФИОСовпали.Фамилия,
                    ТаблицаТехГдеЦехИФИОСовпали.Цех
                ИЗ
                    ТаблицаТехГдеЦехИФИОСовпали КАК ТаблицаТехГдеЦехИФИОСовпали)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Таблица2.Фамилия,
    Таблица2.Цех,
    Таблица2.НормаЧасов
ПОМЕСТИТЬ СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху
ИЗ
    Таблица2 КАК Таблица2
ГДЕ
    Таблица2.Фамилия В
            (ВЫБРАТЬ
                ТаблицаФИОКоторыеЕстьВОбоихТаблицах.Фамилия
            ИЗ
                ТаблицаФИОКоторыеЕстьВОбоихТаблицах КАК ТаблицаФИОКоторыеЕстьВОбоихТаблицах)
    И НЕ (Таблица2.Фамилия, Таблица2.Цех) В
                (ВЫБРАТЬ
                    ТаблицаТехГдеЦехИФИОСовпали.Фамилия,
                    ТаблицаТехГдеЦехИФИОСовпали.Цех
                ИЗ
                    ТаблицаТехГдеЦехИФИОСовпали КАК ТаблицаТехГдеЦехИФИОСовпали)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ТаблицаТехГдеЦехИФИОСовпали.Фамилия,
    ТаблицаТехГдеЦехИФИОСовпали.Цех,
    ТаблицаТехГдеЦехИФИОСовпали.НормаЧасов
ИЗ
    ТаблицаТехГдеЦехИФИОСовпали КАК ТаблицаТехГдеЦехИФИОСовпали

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху.Фамилия,
    СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху.Цех,
    СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху.НормаЧасов
ИЗ
    СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху КАК СтрокиИЗТаблицы1КоторыеНеСовпалиПоцеху

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху.Фамилия,
    СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху.Цех,
    СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху.НормаЧасов
ИЗ
    СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху КАК СтрокиИЗТаблицы2КоторыеНеСовпалиПоцеху
   evorle145
 
61 - 22.11.18 - 08:54
(59) не соединяем, а объединяем, опечатался*
   yalex
 
62 - 22.11.18 - 09:23
ВЫБРАТЬ
   ТЗ1.Фамилия,
   ТЗ1.Цех,
   ВЫБОР
      КОГДА ТЗ1.Цех = ТЗ2.Цех ТОГДА
         ТЗ2.НормаЧасов
      ИНАЧЕ ТЗ1.НормаЧасов
   КОНЕЦ КАК НормаЧасов
ИЗ
   &ТЗ1 КАК ТЗ1
   СОЕДИНЕНИЕ
   &ТЗ2 КАК ТЗ2
   ПО ТЗ1.Фамилия = ТЗ2.Фамилия

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ТЗ2.Фамилия,
   ТЗ2.Цех,
   ТЗ2.НормаЧасов
ИЗ
   &ТЗ1 КАК ТЗ1
   СОЕДИНЕНИЕ
   &ТЗ2 КАК ТЗ2
   ПО ТЗ1.Фамилия = ТЗ2.Фамилия
   Bony-andrey
 
63 - 22.11.18 - 09:46

ВЫБРАТЬ
    Таблица1.Фамилия КАК Фамилия,
    Таблица1.Цех КАК Цех,
    Таблица1.НормаЧасов КАК НормаЧасов,
    1 КАК НомТаб,
    1 КАК Вхождений
ПОМЕСТИТЬ ВТ1
ИЗ
    Таблица1 КАК Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Таблица2.Фамилия,
    Таблица2.Цех,
    Таблица2.НормаЧасов,
    2,
    1
ИЗ
    Таблица2 КАК Таблица2
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ1.Фамилия КАК Фамилия,
    ВТ1.Цех КАК Цех,
    СУММА(ВТ1.Вхождений) КАК Вхождений
ПОМЕСТИТЬ ВТ_ГрупФЦ
ИЗ
    ВТ1 КАК ВТ1

СГРУППИРОВАТЬ ПО
    ВТ1.Фамилия,
    ВТ1.Цех
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ1.Фамилия КАК Фамилия,
    СУММА(ВТ1.Вхождений) КАК Вхождений
ПОМЕСТИТЬ ВТ_ГрупФ
ИЗ
    ВТ1 КАК ВТ1

СГРУППИРОВАТЬ ПО
    ВТ1.Фамилия
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_ГрупФЦ.Фамилия КАК Фамилия,
    ВТ_ГрупФЦ.Цех КАК Цех,
    ВТ1.НормаЧасов КАК НормаЧасов
ИЗ
    ВТ_ГрупФЦ КАК ВТ_ГрупФЦ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1
        ПО (ВТ_ГрупФЦ.Фамилия = ВТ1.Фамилия)
            И (ВТ_ГрупФЦ.Цех = ВТ1.Цех)
            И (ВТ_ГрупФЦ.Вхождений = 1
                ИЛИ ВТ_ГрупФЦ.Вхождений = 2
                    И ВТ1.НомТаб = 2)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ГрупФ КАК ВТ_ГрупФ
        ПО (ВТ_ГрупФЦ.Фамилия = ВТ_ГрупФ.Фамилия)
            И (ВТ_ГрупФ.Вхождений > 1)


   uno-group
 
64 - 22.11.18 - 10:06
(51) Вполне прозрачная прикладная логика. Таблица 1 -таблица сменного задания. Таблица 2 вносится мастером по отклонениям от сменного задания. Если чел не сделал норму или сделал больше или его отправили еще на какую то работу.
Если чел делал что было задано в нужном объеме то для уменьшения писанины мастер это в своей таблице не отражает.
В итоге для 200 чел действует таблица 1 и для 5 чел добавляться данные таблицы 2.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует