2016-05-06 4 views
4

Я хочу создать заявление, но я не успеваю это завершить. не могли бы вы взглянуть и сообщить мне, что мне нужно сделать, чтобы закончить это. Моя проблема заключается в том, как добавить эти две части в мой запрос.как использовать count, case и Distinct вместе в sql-сервере

Я хочу посмотреть последние 30 дней заказов для каждого DRV1NUM. Если этот драйвер работал 0 дней, тогда скажите «НЕ АКТИВНО». Если водитель работал более 15 дней, тогда «ПОЛНОЕ ВРЕМЯ» и менее 15 дней - «ЧАСОВОЕ ВРЕМЯ».

В этом случае я хочу посмотреть последние 30 дней заказов и сравнить левое (4) DRIVERNUM со всем DRIVERNUM. В некоторых случаях у нас есть драйверы, где есть 5-я буква после левого 4. Я хочу посмотреть последние 30 дней заказов, и если левый (4) DRV1NUM имеет более одного DRV1NUM, КОГДА глядя на все символы, тогда SAY «MASTER»

 SELECT DISTINCT DRVLICNUM,DOB,COUNTRY,CREDITLIMIT,DRIVERNUM=LEFT(DRIVERNUM,4), 
     SSN,D.VEHICLE,PHN1,DRVLICST,HOST,VEHICLE_MC, 
     VEHICLE_DOT,BACK_APPROVED=CASE WHEN PROBDATE IS NOT NULL THEN 'YES' ELSE 'NO' END 

    -- CASE WHEN COUNT(DISTINCT O.DROPDATE)=0 IN LAST 30 DAYS THEN 'NOT ACTIVE' WHEN COUNT(DISTINCT O.DROPDATE)>15 IN LAST 30 DAYS THEN 'FULL TIME' WHEN COUNT(DISTINCT O.DROPDATE)>=1 AND <=15 THEN 'PART TIME' IN LAST 30 DAYS ELSE NULL AS DAYSWORKED, 

-- --CASE WHEN COUNT(DISTINCT O.DRV1NUM OF LEFT(DRIVERNUM,4)>0 IN LAST 30 DAYS OF ORDERS>1 THEN 'MASTER IC' ELSE NULL AS MASTER 

/* ABOVE TWO STATEMENT I WANT TO ADD */ 
     FROM DRIVER D 

     FULL OUTER JOIN orde_ O ON O.DRV1ID=D.DRIVERID 
     AND ISNUMERIC(DRIVERNUM)=1 and DRIVERNUM NOT IN ('1010') 

Ожидаемый результат, что я хочу

DRVLICNUM Employee DOB  COUNTRY ACTIVESTATUS 
--------------------------------------------------------- 
055243324 CONTRACTOR 1985-04-13 ATLANTA FULL TIME 

Здесь ActiveStatus активен, потому что водитель работал более 15 дней за последние 15 дней, или если он будет меньше 15 дней будет «неполный рабочий день»

+1

вы можете добавить входные и expecterd выходных – Backtrack

+0

Ваших скриптов создает Driver1 и ORDE_1 таблицы, отклоняется от туда имена в запросе, но это не большая проблема. При запуске вашего запроса SSMS выбрасывает 2 ошибки: 'Неверное имя столбца 'DRIVERID'. Неверное имя столбца' PROBDATE '.', Пожалуйста, проверьте свой скрипт. – gofr1

+1

, объясните еще раз несколькими простыми примерами. Специально для вычисления part.last para в желтом не ясно. – KumarHarsh

ответ

1

У меня нет доступа к ссылке на Google, которую вы поделили.

Однако вам нужно использовать CTE (общее выражение таблицы), чтобы получить количество дней, а затем использовать его для вычисления значения столбца ActiveStatus.

Попробуйте использовать ниже код:

; 
WITH CTE1 
AS(
    SELECT D.DRIVERID, 
     COUNT(DISTINCT O.DROPDATE) AS DayCount 
    FROM DRIVER AS D 
    LEFT JOIN ORDER AS O ON D.DRIVERID=O.DRV1ID AND O.DROPDATE BETWEEN CONVERT(DATE,DATEADD(DAY,-30,GETDATE())) AND GETDATE() 
    WHERE ISNUMERIC(D.DRIVERNUM)=1 AND D.DRIVERNUM NOT IN ('1010') 
    GROUP BY D.DRIVERID 
) 
SELECT DRVLICNUM,DOB,COUNTRY,CREDITLIMI,... 
     CASE 
      WHEN DayCount=0 THEN 'NOT ACTIVE' 
      WHEN DayCount<=15 THEN 'PART TIME' 
      WHEN DayCount>=30 THEN 'FULL TIME' 
     END AS ACTIVESTATUS   
FROM CTE1 AS C 
JOIN DRIVER AS D ON C.DRIVERID=D.DRIVERID 
0

здесь два Siple запросы для первого:

1) выбрать порядок по датам и группы водителем (если не более, чем один заказ в день):

select o.DRIVERID 
    , count(*) as cnt 
    from orde_ o 
    where o.DROPDATE betwen GETDATE() AND DATEADD(DAY,-30,GETDATE()) 
    group by o.DRIVERID 

2) выберите драйверы и присоединиться заказы

сгруппированы
select case 
     when o.ctn >= 15 then 'FULL TIME' 
     when o.ctn > 0 then 'PART TIME' 
     else 'NOT ACTIVE' 
    end 
    , <other fields you want> 
    from DRIVER as D 
    left join <query above> as o 
    on o.DRIVERID = d.DRIVERID 

для второго:

select left(d.DRIVERID, 4), count(*) as cnt 
    from DRIVER as D 
    group by left(d.DRIVERID, 4) 
    having count(*) > 1 

и просто присоединиться к нему, если не равно нулю, то сравнивать все идентификаторы

Смежные вопросы