2010-06-23 99 views
1

在我的表中,我有Collection_DateTag_Date字段,這兩個字段的類型爲dateSELECT DISTINCT用於多個字段

我需要查詢此表,將每個日期分隔爲其組成月份,日期和年份,但仍保留Collection_Date日期和Tag_Date日期之間的區別,並且我不想重複。

我嘗試這樣做:

SELECT DISTINCT 
    MONTH(Collection_Date) AS col_month, 
    DAY(Collection_Date) AS col_day, 
    YEAR(Collection_Date) AS col_year, 
    MONTH(Tag_Date) AS tag_month, 
    DAY(Tag_Date) AS tag_day, 
    YEAR(Tag_Date) AS tag_year 
FROM the_table 

然而,這只是一個獨特Collection_DateTag_Date返回行。

我想我想分離成兩個查詢,一個SELECT DISTINCT ing Collection_Date和一個Tag_Date。但是,如果可能的話,我真的想避免多個查詢。

我該如何做到這一點?

+0

如果collection_date和tag_date是同樣的,你想要返回還是隻有一個,如果只有一個,哪一個? – mdma 2010-06-23 16:55:14

回答

2

這個查詢將返回所有唯一collection_date和tag_date。如果collection_date與tag_date相同,則它們都返回。該查詢還返回它是什麼類型的日期:

SELECT DISTINCT MONTH(Collection_Date) AS m, 
    DAY(Collection_Date) AS d, 
    YEAR(Collection_Date) AS y 
    'collection_date' AS dateType 
    FROM the_table 
UNION ALL 
SELECT DISTINCT MONTH(Tag_Date) AS m, 
    DAY(Tag_Date) AS d, 
    YEAR(Tag_Date) AS y, 
    'tag_date' AS dateType 
    FROM the_table 

如果你只想要一個tag_date或collection_date時,他們有一個共同的日期,那麼你可以使用

SELECT m, d, y, MIN(dateType) FROM (
    SELECT MONTH(Collection_Date) AS m, 
     DAY(Collection_Date) AS d, 
     YEAR(Collection_Date) AS y 
     'collection_date' AS dateType 
     FROM the_table 
    UNION ALL 
     SELECT MONTH(Tag_Date) AS m, 
     DAY(Tag_Date) AS d, 
     YEAR(Tag_Date) AS y, 
     'tag_date' AS dateType 
     FROM the_table  
) data 
GROUP BY m, d, y 
1

我敢肯定,你將不得不分裂它。以下將返回一個綜合結果集,但當然基本上是將兩個單獨的查詢結合在一起。

SELECT MONTH(Collection_Date) AS m, 
    DAY(Collection_Date) AS d, 
    YEAR(Collection_Date) AS y 
UNION --For the DISTINCT 
SELECT MONTH(Tag_Date) AS m, 
    DAY(Tag_Date) AS d, 
    YEAR(Tag_Date) AS y 

或現在有一些額外的差異。它將返回不同的日期和類型字段,指示日期是指標籤,集合還是兩者。

WITH the_table AS 
(
SELECT 
    CAST('2010-06-23 00:00:00.000' AS DATETIME) AS Collection_Date, 
    CAST('2010-06-22 00:00:00.000' AS DATETIME) AS Tag_Date 
UNION ALL  
SELECT 
    CAST('2010-06-25 00:00:00.000' AS DATETIME) AS Collection_Date, 
    CAST('2010-06-23 00:00:00.000' AS DATETIME) AS Tag_Date 
    ) 
    SELECT 
    MONTH(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS m, 
    DAY(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS d, 
    YEAR(COALESCE(T1.Collection_Date, T2.Tag_Date)) AS y, 
    CASE WHEN T1.Collection_Date IS NOT NULL AND T2.Collection_Date IS NOT NULL THEN 'Both' 
     WHEN T1.Collection_Date IS NOT NULL THEN 'Collection' 
     ELSE 'Tag' END 
       AS 'Type' 
FROM the_table t1 
FULL OUTER JOIN the_table t2 
ON T1.Collection_Date = T2.Tag_Date 

返回

m   d   y   Type 
----------- ----------- ----------- ---------- 
6   22   2010  Tag 
6   23   2010  Both 
6   25   2010  Collection 
+0

+1:打我吧。 – 2010-06-23 16:43:07

+0

是的,但後來我無法區分收集日期和標記日期...... – 2010-06-23 16:50:18

+0

但是您要求提供DISTINCT列表,因此您將刪除與其中一個相對應的行。我添加了包含類型字段的新版本。 – 2010-06-23 16:54:33