Сложный вопрос по SQL

User avatar
IL
Уже с Приветом
Posts: 9277
Joined: 11 Jul 2000 09:01
Location: 28277

Сложный вопрос по SQL

Post by IL »

Я помогаю нашим заводам получать информацию из баз данных для ежедневхых митингов. Нужно чтобы они видели кто как работал в предыдущий день, какие проблемы были с машинами, и т.д. Мы используем программу, которая называется Factivity для ввода данных в ERP. Factivity отправляет все данные в SQL database и народ использует query для получения данныв в Excel.

Данные нужны только за предыдущий день. Query выглядит так:

FROM Factivity.dbo.Employee Employee
WHERE (Employee.Site='SG690') AND (Employee.Date=(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))

Работает отлично со вторника по пятницу. В понедельник естественно выдаёт данные за воскресенье, т.к. по воскресеньям на заводах работают несколько человек и вводят каие-нибудь данные а большинство машин простаивает. Мне же нужно чтобы в понедельник загружались данные за пятницу, а ещё лучше чтобы за три дня, с пятницы по воскресенье.
Можно ли написать какое-то логическое выражение чтобы работало по разному в зависимости ото дня недели?
IL
Queen Bee
Уже с Приветом
Posts: 900
Joined: 24 Apr 2014 15:10

Re: Сложный вопрос по SQL

Post by Queen Bee »

Можно, есть такая функция WEEKDAY. Можно написать CASE в зависимости от ее результата.
Правда, по Вашему кусочку не очень понятно, где там ее применять.
User avatar
IL
Уже с Приветом
Posts: 9277
Joined: 11 Jul 2000 09:01
Location: 28277

Re: Сложный вопрос по SQL

Post by IL »

Там свё просто:

Code: Select all

SELECT Employee.Site, Employee.Date, Employee.Emp, Employee."Order", Employee.Part, Employee.Part_desc, Employee.Seq, Employee.Ord_qty, Employee.Std_setup, Employee.Std_Run, Employee.Stat, Employee.Setup_hours, Employee.Setup_Code, Employee.Run_hours, Employee.Prob_Hours, Employee.Prob_Code, Employee.Good, Employee.Scrap, Employee.Scrap_Code, Employee.Std_Count, Employee.Scrap_code_Desc
FROM Factivity.dbo.Employee Employee
WHERE (Employee.Site='SG690') AND (Employee.Date=(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
max(date) -- самый последний день с данными. Т.е логически выгладеть должно так:

... AND (Employee.Date=
IF TODAY WEEKDAY =/= MONDAY
(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
ELSE
(date>getdate()-3 )
ENDIF

Я не программист и не знаю SQL, поможете перевести?
IL
Queen Bee
Уже с Приветом
Posts: 900
Joined: 24 Apr 2014 15:10

Re: Сложный вопрос по SQL

Post by Queen Bee »

Я, вообще-то, поклонник SARG in Where clauses, поэтому то, что я буду писать, мне не очень нравится, но Вы можете это использовать.
Я попробовала WEEKDAY и, похоже, это не стандартный T-SQL, не сработал для меня.

Но вот это будет работать:
AND Date > GETDATE() - (CASE WHEN DATEPART(DW, GETDATE()) = 2 THEN 3 ELSE 1 END)
User avatar
IL
Уже с Приветом
Posts: 9277
Joined: 11 Jul 2000 09:01
Location: 28277

Re: Сложный вопрос по SQL

Post by IL »

Большое спасибо! В понедельник проверю и доложу.
IL
Queen Bee
Уже с Приветом
Posts: 900
Joined: 24 Apr 2014 15:10

Re: Сложный вопрос по SQL

Post by Queen Bee »

Да, имейте ввиду, что getdate() returns datetime datatype, т.е. если ваша загрузка происходит в 12 дня, то все, что было до 12 в предыдущий день не будет рассматриваться. Вам, наверно, надо делать CAST или CONVERT to date datatype, чтобы получить правильный набор. Но это все в зависимости от того, что конкретно делается. Если нужна с этим помощь, пишите в личку.
User avatar
IL
Уже с Приветом
Posts: 9277
Joined: 11 Jul 2000 09:01
Location: 28277

Re: Сложный вопрос по SQL

Post by IL »

Мне нужно 24 часа до последнего обновления, т.е. должно быть всё ОК.

Работает отлично, я поменял 2 на 6 (тяпница) и получил данные за три дня.

Большое спасибо!
IL

Return to “Вопросы и новости IT”