2016-05-06 5 views
4

私は文を作成したいが、これを完了するのに成功していない。あなたは一見をして、これを完了するために何が必要なのか教えてください。私の問題は、これらの2つの部分を私のクエリにどのように追加するかによるものです。カウント、ケース、Distinctを一緒にSQLサーバーで使用する方法

各DRV1NUMの注文の過去30日間を見たいと思います。そのドライバーが0日働いている場合は、 'NOT ACTIVE'と答えてください。運転手が15日以上働いた場合は、「フルタイム」と15日未満が「パートタイム」です。

ここでは、注文の最後の30日間を見て、DRIVERNUMの左(4)をDRIVERNUM全体と比較したいと考えています。いくつかの例では、私たちは左から5番目の手紙があるドライバーを持っています。4.注文の最後の30日を見たいと思っています。そして、左の(4)DRV1NUMがすべての文字を見ているときにDRV1NUM 「マスター」

 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') 

私はここActiveStatusは、ドライバが過去15日間に15日以上働いたので、アクティブであるか、それは意志少ない15を、その後場合

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

をしたい予想される出力「パートタイム」になる日数

+1

を比較し、あなたが入力してexpecterd出力 – Backtrack

+0

あなたのスクリプトを追加することができますが、そこから外れDRIVER1とORDE_1テーブルを作成しますクエリの名前が、それは大きな問題ではありません。クエリを実行するとSSMSは2つのエラーをスローします: '無効な列名 'DRIVERID'。無効な列名 'PROBDATE'。スクリプトをチェックしてください。 – gofr1

+1

代わりに、いくつかの簡単な例で再度説明してください。具体的には、黄色の計算部分。最後のパラは明確ではありません。 – 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

は、最初の1のための2つsipleのクエリです:

1)日時及びドライバ(によってグループによる選択順序日あたりが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)ドライバを選択し、groupped注文

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 
に参加1秒間

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

とそれに参加し、nullでないならば、全体のidの

関連する問題