[英]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.