簡體   English   中英

與分組依據和日期范圍的SQL

[英]sql with group by and range of dates

我有一個查詢,該查詢使用最大聚合函數來計算特定選擇日期的重置日期。有一個表vp_Accrual具有有效日期字段。選擇日期被傳遞到生效日期字段,並基於使用最大函數的日期來計算重置日期。查詢僅給出特定選擇日期的結果,它根據傳遞的選擇日期計算重置日期。

我想對其進行修改,以便為我提供一系列日期的重置日期。在“查詢”下,將為一個人提供1月1日的輸出,如下所示。

在此處輸入圖片說明

我們需要修改Query,以便它將給出多個選擇日期而不是一個選擇日期的結果。

我嘗試通過在@selectiondate和@enddate之間添加附加@enddate字段作為生效日期。

但是我猜這種方法是不正確的。

我想傳遞日期范圍,例如1月1日至1月4日,並且每個日期都應提供Output,如下所示

[由於我沒有足夠的復制點,圖像被添加為鏈接] [ 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

請幫我這個查詢

盡我所能,您想要在假的日期表上進行笛卡爾聯接,這會使您的結果一遍又一遍地重復,但每次重復一組不同的日期

像這樣:

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日選擇日期以某種方式選擇1月10日,而3月1日選擇日期選擇了11月10日。一月

這是完全未經測試的; 您沒有提供示例數據,僅提供了結果圖像,而我是從iPad上發布的,因此生成測試數據非常費力,將其全部輸入

您將日期混合為varchar和datetime。 請更加努力地將這些數據類型分開。 始終將日期作為日期,而不是字符串。 切勿將日期存儲為字符串。 永遠不要依賴日期和字符串之間的隱式轉換

DATEFROMPARTS出現在sqlserver 2012中,我認為,如果您的sql早於此,請使用帶格式字符串的convert將您的字符串轉換為日期。.不要將selectiondate聲明為varchar!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM