2015-02-22 2 views
0

Я работаю с SQL на некоторое время, так что довольно новичок, но очень быстро поймал. У меня есть очень интенсивный запрос, который мне нужно создать для отчета - у меня есть это в excel и использовании IF-операторов и работает отлично.Как перенести критерии даты из нескольких столбцов из одной таблицы?

Вот что мне нужно: У меня есть одна таблица с несколькими столбцами, содержащие даты.

У одного «имени веяния флага» может быть более одной даты. Таково возможности/пример:

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

мне нужно вытащить данные из каждого столбца, содержащего дату фильтра (прокатных 6 месяцев) я прочитал множественный выбор операторов выбора. Это то, что у меня есть, но это говорит мне, что мне нужны СУЩЕСТВА - надеюсь, кто-то может помочь !!

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()) 
) 

Мне нелегко обернуть голову вокруг этого. Есть ли более простой способ сделать это? Любая помощь приветствуется.

+3

Можете ли вы поделиться некоторыми данными примера и результатом, которого вы пытаетесь достичь? – Mureinik

+0

Я посмотрю, что я могу придумать. Просто надеялся, если кто-нибудь скажет мне, как добиться получения данных из нескольких столбцов без дублирования идентификатора ПК. Из дополнительных исследований, которые я сделал - я предполагаю, что это может повлечь за собой запрос CTE –

+0

Я смог понять это. –

ответ

0

Вот как это делается, если вы хотите вытащить определенные критерии из нескольких столбцов.

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 '%' [email protected]_Name+ '%' OR @Emp_Name IS NULL) 

ORDER BY emp.Emp_Name ASC; 
+0

Я следую тому, что вы говорите, но небольшое объяснение, сопровождающее такой кусок кода, сделает ваш ответ более полезным. – J0e3gan

Смежные вопросы