2017-04-19 18 views
0

「ベンダー(マスター)に送信された時間と私たちが送信しようとしている時間(負荷)の2つのテーブルがあります。小計と各個人のために月と年に基づいて時間を合計する。我々は、特定の月の300以上の時間を持っているそれらの個人を見つけたい。毎月の合計を加算しようとしています

CREATE TABLE MasterTabletesting(
    ID   CHAR(9) NOT NULL 
    ,Workdate DATE NOT NULL 
    ,Emp   CHAR(30) NOT NULL 
    ,HoursWorked DECIMAL(18,2) NOT NULL); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','7502',24); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','21874',128); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','20160731','7502',166); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','7508',180); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','5501',180); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','20160831','21037',23); 
    INSERT INTO MasterTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('66','20160831','83641',22); 



    CREATE TABLE LoadTabletesting(
    ID   CHAR(9) NOT NULL 
    ,Workdate CHAR(8) NOT NULL 
    ,Emp   CHAR(30) NOT NULL 
    ,HoursWorked DECIMAL(18,2) NOT NULL); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('8','07312016','7500',24); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('6','07312016','21974',128); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('25','07312016','7500',166); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('72','08312016','7500',180); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('88','08312016','5507',180); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('23','08312016','21012',23); 
    INSERT INTO LoadTabletesting(ID,Workdate,Emp,HoursWorked) VALUES ('55','08312016','83667',22);} 

ロード・テーブル内の日付は、char変数の型であります私はキャストで解決しました。私のアプローチは、両方のテーブルから必要なデータを "Over300agtest:

SELECT ID AS 'ID' 
,Employer AS 'Emp' 
,month(WorkDate) AS 'Mnth' 
,year(WorkDate) AS 'Yr' 
,HoursworkedAS 'Hrs' 
,’amt’ as ‘Table’ 
FROM Mastertabletesting 
WHERE HoursWorked IS NOT NULL 
GROUP BY ID, Employer, month(WorkDate), year(WorkDate) 

UNION all 

SELECT ID AS 'ID' 
,Employer AS 'Emp' 
,month(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE)) AS 'Mnth' 
,YEAR(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE)) AS 'Yr' 
,hoursworked AS 'Hrs' 
,‘alt’ as ‘Table’ 
FROM Loadtabletesting 
WHERE HoursWorked IS NOT NULL 
GROUP BY ID, Employer, month(CAST((RIGHT(workdate, 4) +LEFT workdate,4)) AS DATE)), year(CAST((RIGHT(workdate, 4) + LEFT(workdate, 4)) AS DATE)) 
というタイトルのビューに配置することでした

次に、共通のテーブル式を使用して、特定の月に300時間を超えるものを見つけて、それらが働いていた雇用主を追加するためにクエリを使用してCTEに参加しています。毎月の時間列の下に行を追加する方法に関する提案は、合計で大いにありがたく思います。ここで

with monthsum as(
    Select ID as 'ID' 
    , mnth as 'mnth' 
    , yr as 'yr' 
    ,SUM(hrs)as 'TotalHrs' 
    From over300agtest 
    Group by ID, mnth, yr 
    having SUM(hrs) > 300) 

Select ms.ID 
,ms.mnth 
,ms.yr 
,emp 
,hrs 
,o3.[table] 
,totalhrs 
From monthsum ms left outer join over300agtest o3 
on ms.ID = o3.ID and ms.mnth = o3.mnth and ms.yr =o3.yr 
Order by ms.ID, ms.yr asc, ms.mnth asc 

は電流出力である:ここでは

+----+------+------+-------+-----+-------+----------+ 
| ID | mnth | yr | emp | hrs | table | totalhrs | 
+----+------+------+-------+-----+-------+----------+ 
| 25 | 7 | 2016 | 7502 | 24 | AMT |  484 | 
| 25 | 7 | 2016 | 21874 | 128 | AMT |  484 | 
| 25 | 7 | 2016 | 7502 | 166 | AMT |  484 | 
| 25 | 7 | 2016 | 7500 | 166 | ALT |  484 | 
| 72 | 8 | 2016 | 7508 | 180 | AMT |  563 | 
| 72 | 8 | 2016 | 5501 | 180 | AMT |  563 | 
| 72 | 8 | 2016 | 21037 | 23 | AMT |  563 | 
| 72 | 8 | 2016 | 7500 | 180 | ALT |  563 | 
+----+------+------+-------+-----+-------+----------+ 

は私がつもり出力されます:

+-------+------+------+-------+-----+-------+ 
| ID | mnth | yr | emp | hrs | table | 
+-------+------+------+-------+-----+-------+ 
| 25 | 7 | 2016 | 7502 | 24 | AMT | 
| 25 | 7 | 2016 | 21874 | 128 | AMT | 
| 25 | 7 | 2016 | 7502 | 166 | AMT | 
| 25 | 7 | 2016 | 7500 | 166 | ALT | 
| Total |  |  |  | 484 |  | 
| 72 | 8 | 2016 | 7508 | 180 | AMT | 
| 72 | 8 | 2016 | 5501 | 180 | AMT | 
| 72 | 8 | 2016 | 21037 | 23 | AMT | 
| 72 | 8 | 2016 | 7500 | 180 | ALT | 
| Total |  |  |  | 563 |  | 
+-------+------+------+-------+-----+-------+ 
+1

サンプルデータだけでなく、 'Load'テーブルと' Master'テーブルのためのテーブルスキーマを提供できる場合に役立ちます。もっと重要なことは、レコードを単一のビューにプッシュするときに重複する可能性のある両方のテーブルに 'ID'があるように思えるということです。 – bc004346

+0

あなたの質問を改善するためのヒントについては、[こちら](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)をお読みください。 – HABO

+0

プレーンなSQLを使って何をしようとしているのか分かりません。パーティショニングによってhrs合計を得ることができますが、探しているディスプレイ出力をプログラムで取得する必要があると思います。 – Shawn

答えて

0

私はこのアプローチを示唆しています。あなたは具体的なことを考えることができるはずです。

select convert(char(6), cast(workdate as date), 120) yearMonth 
, sum(hrs) totalHours 
from etc 
group by convert(char(6), cast(workdate as date), 120) 
having sum(hrs) > 300 
+0

私はSQL Server 2008を使用しています。上記のコードを使用しようとしました。メッセージを受信しました:メッセージ241、レベル16、状態1、行1 文字列から日付および/または時刻を変換すると変換に失敗しました。 – Michael

関連する問題