2017-08-26 95 views
0

我有一个查询,它使用最大聚合函数来计算特定选择日期的重置日期。有一个表vp_Accrual有有效日期field.selection日期被传递到有效日期字段和基于使用最大值函数计算重置日期。此查询只给出特定选择日期的结果。它会根据所选择的日期计算重置日期。sql与日期组和范围

我想对其进行修改,以便它能给我一个日期范围的重置日期。 下面的查询给出了1月1日之后的一个人的输出如下。

enter image description here

我们需要修改查询,以便它会给对于多重选择日期,而不是只有一个选择日期的结果。

我试着在@selectiondate和@enddate之间添加@enddate字段作为有效日期。

但我想这种方法是不正确的。

我想传递范围的日期,如1月1日至1月4日,它应该给每个日期输出如下

[图像将作为链接,因为我没有足够的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

Stackoverflow ID不允许我直接添加图像,因为我需要在stackoverflow.so上有min8mum 10声望点,图像作为链接添加。 –

+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天,但您的第一次选举日期选择了第11次1月

这完全没有经过测试;您没有提供任何样本数据,只有结果图像,我从iPad上发布,因此生成测试数据将非常费力,请将其全部输入

您将日期混合为varchar和datetime。请更加努力地保持这些数据类型的独立性。始终使用日期作为日期,而不是字符串。切勿将日期存储为字符串。从不依赖于日期和字符串之间的隐式转换

DATEFROMPARTS在sqlserver 2012中出现我认为,如果您的sql比这更老,请使用带格式字符串的convert来将您的字符串转换为日期..不要声明selectiondate为一个varchar!