2017-08-26 14 views
0

特定の選択日付のリセット日を計算するためにmax集計関数を使用するクエリがあります。有効なフィールドを持つテーブルvp_Accrualがあります。選択日付がeffectivedateフィールドに渡され、 Max関数を使用すると、リセット日が計算されます。このクエリは、特定の選択日付についてのみ結果を与えます。これは、渡された選択日付に基づいてリセット日付を計算します。sql with group with日付と日付の範囲

日付の範囲の日付をリセットするように修正したい Below Queryは、1月1日の日付で1人の出力を出力します。

enter image description here

我々は、それが代わりに一つだけ選択日付の複数の選択日付の結果が得られますようにクエリを変更する必要があります。

@electendeddateと@enddateの間にeffectivedateとして追加@enddateフィールドを追加してみました。

しかし、そのアプローチは正しいとは思いません。

私は1月4日に、このような1月1日などの日付の範囲を、渡したい、それが

以下のように各日付の出力を与える必要があります[私は十分Repuationポイントを持っていけないよう画像をリンクとして追加される] [https://i.stack.imgur.com/0HSX1.jpg]

以下は使用されるクエリです。

DECLARE @selectionDate datetime 

SET @selectionDate = CONVERT(nvarchar(10), DATEADD(dd, 0, CAST('01/01/2017' AS datetime)), 101) 



SELECT 
    e.personnum, 
    ac.name as Accrul_Code, 
    @selectionDate as Selection_DATE, 
    CASE 
     WHEN MAX(va.effectivedate) IS NULL THEN CAST('1/1/1753' AS datetime) 
     ELSE MAX(va.effectivedate) 
    END AS resetdate 
    FROM vp_employeev42 e WITH (NOLOCK) 
    INNER JOIN accrualprofile ap 
    ON e.accrualprflname = ap.name 
    INNER JOIN accrualprofilemm apm 
    ON apm.accrualprofileid = ap.accrualprofileid 
    INNER JOIN accrualrule ar 
    ON apm.accrualruleid = ar.accrualruleid 
    INNER JOIN accrualcode ac 
    ON ac.accrualcodeid = ar.accrualcodeid 
    LEFT OUTER JOIN vp_accrual va 
    ON va.accrualcodeid = ar.accrualcodeid 
    AND e.personid = va.personid 
    AND accrualtrantype IN (3, 11) 
    AND va.effectivedate <= @selectionDate 

    WHERE 
    ac.NAME IN ('FT PTO','LOC','EPT - 5','PT PTO','EPT') 
    AND va.DISQUALIFIEDSW != 1 
    and e.PERSONNUM='00152' 
    GROUP BY e.personnum, 
      ac.name 

このクエリ

+2

質問している内容が不明です。また、それはあなたのテーブル構造、データサンプルと期待される結果を転写する画像への無礼な投稿リンクとみなされます。あなたを助けるのは簡単でしょう。 – Horaciux

+0

私は画像を直接追加することはできませんが、私はmin8mum 10の評判ポイントをstackoverflow.soにする必要があるので、画像はリンクとして追加されます。 –

+0

あなたは画像を求められていません。消耗品のテストデータを要求されています...テーブルを作成し、そのテストデータに基づいてステートメントと予想される結果を挿入します。これにより、人々は可能なソリューションを作成してテストすることができます。 https://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

0

私はあなたがデカルトは、あなたの結果は何度も自分自身を繰り返すことになります偽の日付テーブルに参加したい、作るが、異なるセットのためにできるベストで私を助けてくださいしかし

DECLARE @selectionDate datetime 
DECLARE @endDate datetime 
SET @selectionDate = DATEFROMPARTS(2017,1,1) 
SET @endDate = DATEFROMPARTS(2017,5,1) 

WITH dates (IncDate) AS (
SELECT @selectionDate UNION ALL 
SELECT DATEADD(month,1,IncDate) FROM dates WHERE Incdate <= @endDate) 

SELECT 
    e.personnum, 
    ac.name as Accrul_Code, 
    IncDate as Selection_DATE, 
    MAX(COALESCE(effectivedate, CAST('1/1/1753' AS datetime)) AS resetdate 
    FROM vp_employeev42 e WITH (NOLOCK) 
    INNER JOIN accrualprofile ap 
    ON e.accrualprflname = ap.name 
    INNER JOIN accrualprofilemm apm 
    ON apm.accrualprofileid = ap.accrualprofileid 
    INNER JOIN accrualrule ar 
    ON apm.accrualruleid = ar.accrualruleid 
    INNER JOIN accrualcode ac 
    ON ac.accrualcodeid = ar.accrualcodeid 
    CROSS JOIN dates 
    LEFT OUTER JOIN vp_accrual va 
    ON va.accrualcodeid = ar.accrualcodeid 
    AND e.personid = va.personid 
    AND accrualtrantype IN (3, 11) 
    AND effectivedate <= IncDate 



    WHERE 
    ac.NAME IN ('FT PTO','LOC','EPT - 5','PT PTO','EPT') 
    AND va.DISQUALIFIEDSW != 1 
    and e.PERSONNUM='00152' 
    GROUP BY e.personnum, 
      ac.name, 
      IncDate 

いくつかの注意事項:

日付ごとにこのような

何かの

このクエリはあなたが投稿した結果を生成することはできませんが、どちらもあなたのことはできません。リセットの日付は選択日よりも小さい最大日付ですが、2月の最初の選択日は何とか1月の10分の1を選択しますが、最初の3月の選択日は11月の11日を選択します。 Jan.

これは完全にテストされていません。サンプルデータは提供せず、結果の画像のみを提供し、iPadから投稿したので、テストデータの生成には大変な労力がかかります。

あなたの日付はvarcharとdatetimeで混在しています。これらのデータタイプを別々に保つことにもっと勤勉にしてください。常に日付を文字列ではなく日付として扱います。日付を文字列として保存しないでください。日付と文字列の間の暗黙の変換に決して頼らないでください

DATEFROMPARTSはsqlserver 2012に付属しています。あなたのsqlがこれより古ければ、フォーマット文字列を使用して文字列を日付に変換します。 varchar!