2016-08-26 8 views
1

私は作業中の人員に関係なく、完了したジョブの数を取得しようとしています。私がする必要があるのは、重複を取り除くことです。行全体が重複しないので、DISTINCTはここでは機能しません。 JobCode、JobType TaskTime、および曜日に基づいて重複がある場合は除外したいと思います。だから私のテーブルには、次のようになります。ユニークな値だけを返してください

JobCode JobType TaskTime EmployeeID M Tu W Th F Sa Su 
================================================================== 
1800 1  06:49  101   1 1 1 1 1 0 0 
1800 1  06:49  102   1 0 0 0 0 0 0 
1800 1  07:04  101   1 1 1 1 1 0 0 
1800 1  07:26  101   1 1 1 1 1 0 0 
1800 1  07:49  101   1 1 1 1 1 0 0 
1800 2  15:55  101   1 1 1 1 1 0 0 
1800 1  16:20  101   1 1 1 1 1 0 0 
1800 1  16:50  101   1 1 1 1 1 0 0 
1800 2  16:55  101   1 1 1 1 1 0 0 

私のSQLクエリのデータが返され、この

SELECT t1.JobCode, t1.JobType, 
    t1.M, t1.Tu, t1.W, t1.Th, t1.F, t1.Sa, t1.Su, 
    SUM(t1.M + t1.Tu + t1.W + t1.Th + t1.F + t1.Sa + t1.Su) as Totals 
FROM Table1 AS t1 
JOIN Table1 AS t1_overlap ON 
    t1_overlap.EmployeeID = t1.EmployeeID AND 
    t1_overlap.JobType = t1.JobType AND 
    t1_overlap.TaskTime = t1.TaskTime 
    AND 
    (
    (t1.M = 1 AND t1_overlap.M = t1.M) OR 
    (t1.Tu = 1 AND t1_overlap.Tu = t1.Tu) OR 
    (t1.W = 1 AND t1_overlap.W = t1.W) OR 
    (t1.Th = 1 AND t1_overlap.Th = t1.Th) OR 
    (t1.F = 1 AND t1_overlap.F = t1.F) OR 
    (t1.Sa = 1 AND t1_overlap.Sa = t1.Sa) OR 
    (t1.Su = 1 AND t1_overlap.Su = t1.Su) 
    ) 
GROUP BY t1.JobCode, t1.JobType, t1.M, t1.Tu, t1.W, t1.Th, t1.F, t1.Sa, t1.Su 

のようなものです私は何を見たいことだけ一意の値である。この

JobCode JobType M Tu W Th F Sa Su Totals 
================================================== 
1800 1  1 0 0 0 0 0 0 1 
1800 1  1 1 1 1 1 0 0 30 
1800 2  1 1 1 1 1 1 1 10 

のようなものです従業員101がその同じ日に同じ仕事をしているのを見ているので、従業員102がMだけで仕事をしていることを示す最初の行は望んでいません。それでは、私が代わりに見てみたいことは以下の通りです:

JobCode JobType M Tu W Th F Sa Su Totals 
================================================== 
1800 1  1 1 1 1 1 0 0 30 
1800 2  1 1 1 1 1 0 0 10 

本当に私は曜日を確認する必要はありません、私はちょうど私が返されていただきました!見ることができ、ここでそれらを示しています。私は実際に出力を参照する必要があるのは、JOBTYPE JOBCODEであり、次のように合計:

JobCode JobType Totals 
====================== 
1800 1  30 
1800 2  10 

ヘルプは大歓迎です。

+0

従業員101が102よりもどのように優先されますか?どのように「1」がそのジョブコード/タイプの合計に含まれないのでしょうか?ここでの論理は何ですか? – JNevill

+1

@SeanLange別のフォーラムのメインページにリダイレクトしないでください。それは役に立たない回答です。私はここに投稿する前にいくつかの場所を検索して、ちょうど私が探しているものを見つけていない。 – aantiix

+0

間違ったリンクを投稿したためですhttp://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

2

私は、トリックを行うだろう、結果を合計し、あなたのキーでグループ化する、あなたは毎日の最高をつかむ迅速なサブクエリを考える:

SELECT 
    jobcode, 
    jobtype, 
    sum(monday+tuesday+wednesday+thursday+friday+saturday+sunday) AS total 
FROM 
    (
     SELECT 
      jobcode, 
      jobtype, 
      tasktime, 
      max(m) as monday, 
      max(tu) as tuesday, 
      max(w) as wednesday, 
      max(th) as thursday, 
      max(f) as friday, 
      max(sa) as saturday, 
      max(su) as sunday 
     FROM Table1 T1 
     GROUP BY jobcode, jobtype, tasktime 
    ) t2 
GROUP BY jobcode, jobtype 

よりも雄弁な何かがあるかもしれませんそれは仕事を終わらせるはずです。

+0

それは私が必要なもの、ありがとう! – aantiix

0

次のクエリを試してみてください。

;With cte1 
as 
(SELECT ROW_NUMBER()OVER(PArtition by t1.JobCode,t1.JobType order by t1.JobCode,t1.JobType) RNO,t1.JobCode, t1.JobType, 
    SUM(t1.M + t1.Tu + t1.W + t1.Th + t1.F + t1.Sa + t1.Su) OVER(partition by t1.JobCode,t1.JobType ORDER BY t1.JobCode,t1.JobType) as Totals 
FROM Table1 AS t1 
JOIN Table1 AS t1_overlap ON 
    t1_overlap.EmployeeID = t1.EmployeeID AND 
    t1_overlap.JobType = t1.JobType AND 
    t1_overlap.TaskTime = t1.TaskTime 
    AND 
    (
    (t1.M = 1 AND t1_overlap.M = t1.M) OR 
    (t1.Tu = 1 AND t1_overlap.Tu = t1.Tu) OR 
    (t1.W = 1 AND t1_overlap.W = t1.W) OR 
    (t1.Th = 1 AND t1_overlap.Th = t1.Th) OR 
    (t1.F = 1 AND t1_overlap.F = t1.F) OR 
    (t1.Sa = 1 AND t1_overlap.Sa = t1.Sa) OR 
    (t1.Su = 1 AND t1_overlap.Su = t1.Su) 
    )) 

    SELECT t1.JobCode, t1.JobType,Totals 
    FROM cte1 
    WHERE RNO=1 
0

基本的には、非常に素晴らしいROW_NUMBER関数を使用して、効果的に1)グループ化を定義し、2)各グループの最初の行のみを取るようにクエリをラップすることができます。 over (partition by ... order by ...)句をよく調べて、グループ化と「ランキング」(結果に結びつけるもの)を制御する方法を理解してください。

select JobCode, JobType, Totals 
from (
    SELECT t1.JobCode, t1.JobType, SUM(t1.M + t1.Tu + t1.W + t1.Th + t1.F + t1.Sa + t1.Su) as Totals 
      ,row_number() over (partition by t1.JobCode order by t1.JobType) as rseq 
    FROM Table1 AS t1 
    JOIN Table1 AS t1_overlap ON 
     t1_overlap.EmployeeID = t1.EmployeeID AND 
     t1_overlap.JobType = t1.JobType AND 
     t1_overlap.TaskTime = t1.TaskTime 
     AND 
     (
     (t1.M = 1 AND t1_overlap.M = t1.M) OR 
     (t1.Tu = 1 AND t1_overlap.Tu = t1.Tu) OR 
     (t1.W = 1 AND t1_overlap.W = t1.W) OR 
     (t1.Th = 1 AND t1_overlap.Th = t1.Th) OR 
     (t1.F = 1 AND t1_overlap.F = t1.F) OR 
     (t1.Sa = 1 AND t1_overlap.Sa = t1.Sa) OR 
     (t1.Su = 1 AND t1_overlap.Su = t1.Su) 
     ) 
    GROUP BY t1.JobCode, t1.JobType, t1.M, t1.Tu, t1.W, t1.Th, t1.F, t1.Sa, t1.Su 
) x 
where rseq = 1 --filter to keep only the "first" row (JobType) for each JobCode 

なお有効であり、この例では、あなたが「JOBCODEごとに1つの行」を見てみたいと仮定して、「そのJOBCODEするための第1のJOBTYPE」続ける「あなたは維持するかを決めるんか」についてのコメント。これは、あなたが少し鮮明に使用したいロジックを説明するならば、適合するように調整することができます。

関連する問題