Sql 为多个字段选择DISTINCT

Sql 为多个字段选择DISTINCT,sql,Sql,在我的表中,我有Collection\u Date和Tag\u Date字段,这两个字段的类型都是Date 我需要查询此表,将每个日期分为其组成部分月、日和年,但仍保留收集日期日期和标记日期日期之间的区别,我不希望重复 我试过这个: SELECT DISTINCT MONTH(Collection_Date) AS col_month, DAY(Collection_Date) AS col_day, YEAR(Collection_Date) AS col_year,

在我的表中,我有
Collection\u Date
Tag\u Date
字段,这两个字段的类型都是
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
但是,这仅返回具有唯一的
集合日期
标记日期
的行

我想把它分成两个查询,一个是
选择DISTINCT
ing
Collection\u Date
,另一个是
Tag\u Date
。但是,如果可能的话,我真的希望避免多次查询


我怎样才能做到这一点呢?

我很确定你必须把它分开。下面将返回一个合并的结果集,但实际上是两个单独的查询连接在一起

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

此查询将返回所有唯一的集合日期和标记日期。如果集合日期与标记日期相同,则两者都将返回。查询还返回它是哪种类型的日期:

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
如果您只需要一个标记日期或集合日期,而它们有一个共同的日期,那么您可以使用

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

但您要求的是一个不同的列表,因此您将删除其中一个对应的行。我添加了一个包含类型字段的新版本。如果collection_date和tag_date相同,您希望两者都返回还是仅返回一个,如果仅返回一个,则返回哪一个?