2011-11-15 11 views
0

が、私は以下の形式で結果をもたらすSQLクエリを書かれているSQL Serverのクエリを再フォーマットする方法は?

ResourceName ProjectName TaskName Timesheet Period ActualWork TimeByDay DayName 

    Jim Carry  Project A Task A 2011-12   40  09/10/2011 Monday 

    Jim Carry  Project A Task A 2011-12   70  09/10/2011 Monday 
    Jim Carry  Project B Task A 2011-12   80  09/12/2011 Tue. 
    Perth S.   Project A Task A 2011-12   35  09/10/2011 Mon. 

私はそれは私のような何かを与えるようにクエリを書きたいです。

ResourceName ProjectName   TaskName   Timesheet Period Monday Tue 
Jim Carry   Project A  Task A   2011-12   110 80 

このように、新しい列は月曜日、火曜日などの2番目のクエリ名に作成されています。さらに、合計は曜日に基づいて計算されるため、月曜日の列の結果は40 + 70で、火曜日の結果は80 + 0です。以下は

コードスニペット1

DECLARE @startdate DATETIME 
DECLARE @enddate DATETIME 

SET @startdate='1/1/2011' 
SET @enddate='12/31/2011' 

SELECT TOP 100 [IR.TimesheetProjectHoursByDay].ResourceName, 
       [IR.TimesheetProjectHoursByDay].ProjectName, 
       [IR.TimesheetProjectHoursByDay].TaskName, 
       [IR.TimesheetProjectHoursByDay].PeriodName + ' ' + '(' + CONVERT(NVARCHAR, [IR.TimesheetProjectHoursByDay].PeriodStartDate, 101) + ' - ' + CONVERT(NVARCHAR, [IR.TimesheetProjectHoursByDay].PeriodEndDate, 101) + ')' AS [Timesheet Period], 
       [IR.TimesheetProjectHoursByDay].ActualWork, 
       [IR.TimesheetProjectHoursByDay].TimeByDay, 
       DATENAME(dw,TimeByDay) as [DayName] 
FROM [IR.TimesheetProjectHoursByDay] 
WHERE [IR.TimesheetProjectHoursByDay].TimeByDay >= @StartDate 
     AND [IR.TimesheetProjectHoursByDay].TimeByDay <= @EndDate 
     AND [IR.TimesheetProjectHoursByDay].[Project Departments] LIKE N'CSENG' 
     AND [IR.TimesheetProjectHoursByDay].ActualWork > 0 
     AND [IR.TimesheetProjectHoursByDay].ResourceName LIKE '%Jim%' 
GROUP BY [IR.TimesheetProjectHoursByDay].TimeByDay, 
      [IR.TimesheetProjectHoursByDay].ResourceName, 
      [IR.TimesheetProjectHoursByDay].ProjectName, 
      [IR.TimesheetProjectHoursByDay].TaskName, 
      [IR.TimesheetProjectHoursByDay].[Project Departments], 
      [IR.TimesheetProjectHoursByDay].ResourceStandardRate, 
      [IR.TimesheetProjectHoursByDay].PeriodName, 
      [IR.TimesheetProjectHoursByDay].PeriodStartDate, 
      [IR.TimesheetProjectHoursByDay].PeriodEndDate, 
      [IR.TimesheetProjectHoursByDay].ActualWork 
ORDER BY [IR.TimesheetProjectHoursByDay].TimeByDay DESC 

をもたらすクエリは、私はコードスニペット2で述べたように、私は結果を得ることができるように、SQLクエリに何をする必要があるかの変化を私に提案してくださいすることはできますか?

必要な入力があれば教えてください。物事をより明確に見せるテストデータシートを見つけてくださいhere ガイドしてください!

ありがとうございます!

+1

これは誤った結果にはなりませんが、クエリが元の結果セットのタスクaとbに実際に分割されたときに、タスクAに依然として110時間を割り当てているためです。 –

+0

ありがとうございました。私は今私の結果セットを変更しました。 –

+0

さらに、タスクBの場合でも、実際には何も問題はありませんでした。計算する必要があるのは、ジム・キャリーが働いている仕事の総時間です。 –

答えて

0

私はあなたがこれを試すことができます修正理解していれば:

create table #tbl (ResourceName varchar(100), ProjectName varchar(100), TaskName varchar(100), ActualWork int, TimeByDay date) 

insert into #tbl values ('Jim Carry','Project A','Task A',40,'20111009'), 
('Jim Carry','Project A','Task A',70,'20111009'), 
('Jim Carry','Project B','Task B',80,'20111209'), 
('Perth S.','Project A','Task A',35,'20111209') 

select ResourceName,ProjectName, year(TimeByDay), MONTH(TimeByDay), 
     sum(case when datename(weekday, TimeByDay)='Monday' then ActualWork else 0 end) Monday, 
     sum(case when datename(weekday, TimeByDay)='Tuesday' then ActualWork else 0 end) Tuesday, 
     sum(case when datename(weekday, TimeByDay)='Wednesday' then ActualWork else 0 end) Wednesday, 
     sum(case when datename(weekday, TimeByDay)='Thursday' then ActualWork else 0 end) Thursday, 
     sum(case when datename(weekday, TimeByDay)='Thursday' then ActualWork else 0 end) Thursday, 
     sum(case when datename(weekday, TimeByDay)='Friday' then ActualWork else 0 end) Friday, 
     sum(case when datename(weekday, TimeByDay)='Saturday' then ActualWork else 0 end) Saturday, 
     sum(case when datename(weekday, TimeByDay)='Sunday' then ActualWork else 0 end) Sunday 
from #tbl 
group by ResourceName,ProjectName, year(TimeByDay), MONTH(TimeByDay) 

drop table #tbl 

CJMが示唆されているようにあなたがまたPIVOTを使用することができます。

+0

表示された元のクエリでは日付が変数として取り込まれることに注意してください。それは理論的に1年分のデータを報告することができます(これは、月曜日のことです)。私は1日の合計時間を取得することをお勧めし、データを表示するためのより良い方法を考え出すことができます(日付によって)。 –

+0

@Igor、クエリのおかげで。これは、Mon-Sunの名前の列を作成するのに本当に役立ちました。しかし、私は期間列に基づいて値を合計する必要がある場合はどうすればよいですか?だから私は同じ期間(2011年12月)2,1&8として月曜日の3行を取得しています。私は11のように値を追加して持ち上げる必要があります。同じことがTue-Sunのためになります –

+0

@ Xorpower申し訳ありませんが、私はあなたが意味するものを得ることができません: '私は11として値を追加し、あなたは年にそれらをグループ化する必要がありますか? –

0

あなたはあなただけのようなもの試みることができる特定の日にリソースによって労働時間の合計数の後にあるとして、それは本当に問題ではありませんでしたことを示唆して考えると(を:これはテストされていないですが、単なる一例) ;

SELECT TOP 100 [IR.TimesheetProjectHoursByDay].ResourceName, 
[IR.TimesheetProjectHoursByDay].TimeByDay, 
SUM([IR.TimesheetProjectHoursByDay].ActualWork) OVER(PARTITION BY [IR.TimesheetProjectHoursByDay].TimeByDay) AS "Total Hours" 

これを、数日で整理するための派生テーブルとして使用します。最近、シンプルトークのウェブサイトには素晴らしいpost on Window functionsがありました。読んでみましょう。それは啓発です。

+0

@Mose:あなたのクエリでは集計が表示されますが、Mon-Sunのような列は表示されません –

+0

Igorの投稿に示唆したように、私はあなたの日の名前で出力したいと思っているのは読みやすいでしょう。上記のクエリの例では、1年分のデータが抽出されます。だから私はあなたが追跡している出力をより明確に述べるために質問を編集する必要があると思います。月曜日から日曜日までの7つの曜日の列の下に合計1年間のデータを表示する予定ですか?これが当てはまる場合は、ResourceNameでパーティションにクエリを調整して、それをIgorのクエリ内の派生テーブルとして使用することができます。注:ProjectNameによるグループも無視します。私はあなたがそれを必要としないと思った。 –

関連する問題