2017-04-11 12 views
0

データベースに存在する一連の日付とそれに対応する値(あれば)を取得しようとしています。SQL追加の参照値で順次日付を選択

今日(getDate()を使用している日付)と日数(整数)の2つのパラメータがあります。この例では、その日の値10を使用しています。

コードは、今日から10日間の順次日付を取得する:

SELECT top 10 DATEADD(DAY, ROW_NUMBER() 
OVER (ORDER BY object_id), REPLACE(getDate(),'-','')) as Alldays 
FROM sys.all_objects 

が、私は今、またはタイムテーブルに存在しない場合がありシーケンシャル日コード内のそれぞれの日のためのいくつかの値をルックアップする必要があります(特に明記しない限り、すべての日付で8時間とする)。検索はrecordDateTimeフィールドに行われます。その日のテーブルcap_timeに "時間"値がない場合は、デフォルト値の8を時間数として返す必要があります。以下のようなものである必要があり、次の10日間

   SELECT u.FullName as UserName, d2.department, 
       recordDateTime, ISNULL(hours,8) as hours 
       FROM cap_time c 
       left join user u on c.userID = u.userid 
       left join dept d2 on u.deptID = d2.DeptID 
       WHERE c.userid = 38 AND u.deptID = 1 

私の最終的な結果:ここでは、ベースのクエリです(シーケンシャル) 日は、部門は、ユーザー名は、営業時間

の数が、私はこの使用してTSQLと達成することができます私はこれを単一のステートメントで行うことができるかどうかを確認したいと思います。どんな助けもありがとうございます。

+0

あなたは次の10日間のリストを取得したいと思っていますが、レコードがあるかどうかに関わらず、それらの日付+その日に存在する可能性がありますか?それとも、それが存在する場合は、今後10日間で日付が必要なのですか? – ZLK

+0

はい、正確です。レコードがない場合は、デフォルトの8時間を返します。 – KMBonin

答えて

0

DDLやサンプルデータがなくても、必要なものを正確に判断することは困難です。

私はこれが(私のコメントに注意してください)あなたはかなり近づくだろうと思う:

-- sample data 
------------------------------------------------------------------------------------------ 
DECLARE @table TABLE 
(
    fullName varchar(10), 
    department varchar(10), 
    [hours] tinyint, 
    somedate date 
); 

INSERT @table VALUES 
('bob', 'sales', 5, getdate()+1), 
('Sue', 'marketing', 3, getdate()+2), 
('Sue', 'sales', 12, getdate()+4), 
('Craig', 'sales', 4, getdate()+8), 
('Joe', 'sales', 18, getdate()+9), 
('Fred', 'sales', 10, getdate()+10); 

--SELECT * FROM @table 
; 

-- solution 
------------------------------------------------------------------------------------------ 
WITH alldays([day]) AS -- logic to get your dates for a LEFT date table 
(
    SELECT TOP (10) 
    CAST(DATEADD 
    (
     DAY, 
     ROW_NUMBER() OVER (ORDER BY object_id), 
     getdate() 
    ) AS date) 
    FROM sys.all_objects 
) 
SELECT d.[day], t.fullName, department, [hours] = ISNULL([hours], 8) 
FROM alldays d 
LEFT JOIN @table t ON d.[day] = t.somedate; 

結果:

day  fullName department hours 
---------- ---------- ---------- ----- 
2017-04-12 bob  sales  5 
2017-04-13 Sue  marketing 3 
2017-04-14 NULL  NULL  8 
2017-04-15 Sue  sales  12 
2017-04-16 NULL  NULL  8 
2017-04-17 NULL  NULL  8 
2017-04-18 NULL  NULL  8 
2017-04-19 Craig  sales  4 
2017-04-20 Joe  sales  18 
2017-04-21 Fred  sales  10 
0

たぶんのような文でサブクエリと、:

SELECT u.FullName as UserName, d2.department, 
      recordDateTime, ISNULL(hours,8) as hours 
      FROM cap_time c 
      left join user u on c.userID = u.userid 
      left join dept d2 on u.deptID = d2.DeptID 
      WHERE c.userid = 38 AND u.deptID = 1 and recordDateTime in 
       (SELECT top 10 DATEADD(DAY, ROW_NUMBER() 
        OVER (ORDER BY object_id), REPLACE(getDate(),'-','')) as Alldays 
        FROM sys.all_objects) 
関連する問題