sql-server – 如何在sql server中一起使用count,case和Distinct

我想创建一个声明,但我没有成功完成这个.请你看看,让我知道我需要做些什么来完成这个.我的问题是由于如何在我的查询中添加这两个部分.

I want to look at the last 30 days of orders for each DRV1NUM. If that driver has worked 0 days then say ‘NOT ACTIVE’. If the driver has worked more than 15 days then ‘FULL TIME’ and less than 15 days is ‘PART TIME’.

In this one, I want to look at the last 30 days of orders and compare the left(4) of DRIVERNUM to the entire DRIVERNUM. In some instances, we have drivers where there is a 5th letter after the left 4.I want to look at the last 30 days of orders and if the left(4) DRV1NUM has more than one DRV1NUM WHEN looking at all characters, then 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天,它将是“兼职”

最佳答案 我无法访问您分享的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
点赞