2015-04-14 51 views
0

所以我還是新來交叉連接,我很少使用它們。我能夠爲我的問題的第一部分找到答案,但不是第二部分。使用交叉連接格式化查詢結果

我已經得到了結果輸出的佈局,我想,這裏的結果

+-----------+-----------+-------------------------+ 
| Full Name | cert_type |  expiration  | 
+-----------+-----------+-------------------------+ 
| Jane Doe |   1 | 2015-09-26 00:00:00.000 | 
| Jane Doe |   2 | 2015-04-21 00:00:00.000 | 
| Jane Doe |   3 | 2015-12-16 00:00:00.000 | 
| John Doe |   1 | 2016-10-06 00:00:00.000 | 
| John Doe |   2 | 2015-04-19 00:00:00.000 | 
| John Doe |   3 | 2011-04-12 00:00:00.000 | 
+-----------+-----------+-------------------------+ 

這裏是我的查詢操作:

SELECT 
    [Full Name], 
    cert_type = X.which, 
    expiration = 
     CASE X.which 
     WHEN '1' THEN [License Exp Date] 
     WHEN '2' THEN [Med Cert Exp Date] 
     WHEN '3' THEN [Annual MVR Review Due] 
     END 
FROM employee_data.dbo.EmployeeDataBase 
CROSS JOIN (SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3') X (which) 
WHERE [License Exp Date] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
OR [Med Cert Exp Date] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
OR [Annual MVR Review Due] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
AND [Termination Date] IS NULL 

正如你可以看到,即使WHERE條款仍然存在,它拉動每一個日期,我只想要在WHERE子句內的給定範圍內的日期。我還希望日期輸出就像他們將如果我將它們設置爲 OUTPUT(VARCHAR(10), date, 101)

如果還有其他問題,請告訴我,我會繼續在這裏工作。感謝您收到的所有幫助!

+0

當你給定的列在你的日期範圍之外時,你想要NULL嗎?如果是這樣,請將該條件移至您的案例表達式。至於輸出格式化的日期,我強烈建議您將格式設置保留在前端,而不是在sql中執行。 –

+0

不,我只希望查詢選擇範圍內的日期。如果它們爲空或超出範圍,那麼我不想選擇它們。 –

+0

您的where謂詞適用於整個行,因此如果任何日期都在您的結果集中的範圍內。解決這個問題的一種方法是讓你的上面的查詢成爲一個cte,然後從上面的cte中選擇where謂詞。那會讓你排除每一行。 –

回答

1

就是這樣。你應該養成使用日期部分名稱而不是縮寫的習慣。他們很難記住,使用這個名字非常明確。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx

with MyCTE as 
(
    SELECT 
     [Full Name], 
     cert_type = X.which, 
     expiration = 
      CASE X.which 
      WHEN '1' THEN [License Exp Date] 
      WHEN '2' THEN [Med Cert Exp Date] 
      WHEN '3' THEN [Annual MVR Review Due] 
      END 
    FROM employee_data.dbo.EmployeeDataBase 
    CROSS JOIN (SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3') X (which) 
    WHERE [License Exp Date] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
    OR [Med Cert Exp Date] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
    OR [Annual MVR Review Due] BETWEEN GETDATE() AND DATEADD(dd, 7, GETDATE()) 
    AND [Termination Date] IS NULL 
) 

select * 
from MyCTE 
where expiration BETWEEN GETDATE() AND DATEADD(DAY, 7, GETDATE()) 
+0

謝謝你,先生,這正是我正在尋找的答案! –