繁体   English   中英

如何从一个表中的多列中提取日期条件?

[英]How do I pull date criteria from multiple columns from ONE table?

我一直在使用SQL一段时间这么新,但一直在快速流行。 我有一个非常强烈的查询,我需要为报告创建 - 我在excel中使用它并使用IF语句并且完美地工作。

这就是我所拥有和需要的:我有一个包含多个包含日期的列的表。

一个'Raving Fan Name'可能有多个日期。 这些是可能性/示例:

RavingFan ID 1 = FU Date + Testimonial Date + Bonus Date
RavingFan ID 2 = Referral Date + Signed Date
RavingFan ID 3 = Testimonial Date

我需要从包含日期过滤器(滚动6个月)的每列中提取数据。我已阅读多个select select语句。 这就是我所拥有的,但它告诉我,我需要一个存在 - 希望有人可以帮助!

SELECT 

(SELECT 
rf.Raving_Fan_ID,
rf.Raving_Fan_Name,
cr.Contact_Role_Name,
emp.Emp_Name,
rf.FU_Detail,
rf.FU_Date,
rf.FU_Point,
rf.Bonus_Date,
rf.Bonus_Point

FROM Raving_Fans AS rf

LEFT JOIN Employees AS emp ON rf.Emp_ID = emp.Emp_ID
LEFT JOIN Contact_Role AS cr ON rf.Contact_Role_ID = cr.Contact_Role_ID

WHERE rf.FU_Date BETWEEN DATEADD(day,-181,getdate()) AND DATEADD(day,0,getdate()) 
)

(SELECT 
rf.Raving_Fan_ID,
rf.Raving_Fan_Name,
cr.Contact_Role_Name,
emp.Emp_Name,
rf.Test_Detail,
rf.Test_Date,
rf.Test_Point,
rf.Bonus_Date,
rf.Bonus_Point

FROM Raving_Fans AS rf

LEFT JOIN Employees AS emp ON rf.Emp_ID = emp.Emp_ID
LEFT JOIN Contact_Role AS cr ON rf.Contact_Role_ID = cr.Contact_Role_ID

WHERE  rf.Test_Date BETWEEN DATEADD(day,-181,getdate()) AND DATEADD(day,0,getdate()) 
)

(SELECT 
rf.Raving_Fan_ID,
rf.Raving_Fan_Name,
cr.Contact_Role_Name,
emp.Emp_Name,
rf.Ref_Detail,
rf.Ref_Date,
rf.Ref_Point,
rf.Signed_Date,
rf.Signed_Point,
rf.Bonus_Date,
rf.Bonus_Point

FROM Raving_Fans AS rf

LEFT JOIN Employees AS emp ON rf.Emp_ID = emp.Emp_ID
LEFT JOIN Contact_Role AS cr ON rf.Contact_Role_ID = cr.Contact_Role_ID

WHERE rf.Ref_Date BETWEEN DATEADD(day,-181,getdate()) AND DATEADD(day,0,getdate())
)

我很难绕过这个。 有更简单的方法吗? 任何帮助表示赞赏。

这是如何完成的,如果您想从多列中提取某些条件。

    SET NOCOUNT ON;
SELECT  
    rf.Raving_Fan_ID,
    rf.Raving_Fan_Name AS "Raving Fan",
    cr.Contact_Role_Name AS "Contact Type",
    emp.Emp_Name AS "TCS Employee",

    rf.FU_Detail AS "Follow Ups",
    CASE WHEN rf.FU_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.FU_Date ELSE NULL END AS "FU Date",
    CASE WHEN rf.FU_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.FU_Point ELSE NULL END AS "FU Point",

    rf.Test_Detail AS "Testimonials",
    CASE WHEN rf.Test_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Test_Date ELSE NULL END AS "Test Date",
    CASE WHEN rf.Test_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Test_Point ELSE NULL END AS "Test Point",

    rf.Ref_Detail AS "Referrals",
    CASE WHEN rf.Ref_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Ref_Date ELSE NULL END AS "Ref Date",
    CASE WHEN rf.Ref_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Ref_Point ELSE NULL END AS "Ref Point",
    CASE WHEN rf.Signed_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Signed_Date ELSE NULL END AS "Signed Date",
    CASE WHEN rf.Signed_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Signed_Point ELSE NULL END AS "Signed Point",
    CASE WHEN rf.Bonus_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Bonus_Date ELSE NULL END AS "Bonus Date",
    CASE WHEN rf.Bonus_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Bonus_Point ELSE NULL END AS "Bonus Point",

    (CASE WHEN rf.Ref_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Ref_Point ELSE 0 END +
    CASE WHEN rf.Signed_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Signed_Point ELSE 0 END +
    CASE WHEN rf.FU_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE())   THEN rf.FU_Point ELSE 0 END + 
     CASE WHEN rf.Test_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Test_Point ELSE 0 END + 
     CASE WHEN rf.Bonus_Date BETWEEN CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()) THEN rf.Bonus_Point ELSE 0 END) AS "Total Points"

FROM [dbo].[Raving_Fans] AS rf
    LEFT JOIN Employees AS emp ON rf.Emp_ID = emp.Emp_ID
    LEFT JOIN Contact_Role AS cr ON rf.Contact_Role_ID = cr.Contact_Role_ID

WHERE (rf.FU_Date between CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()))
OR (rf.Test_Date between CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()))
OR (rf.Ref_Date between CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()))
OR (rf.Signed_Date between CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()))
OR (rf.Bonus_Date between CONVERT(date,DATEADD(month, -6, GETDATE())) and CONVERT(date, GETDATE()))
AND(emp.Emp_Name LIKE '%' +@Emp_Name+ '%' OR @Emp_Name IS NULL)

ORDER BY emp.Emp_Name ASC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM