对多个日期字段进行分组的SQL查询

对多个日期字段进行分组的SQL查询,sql,Sql,我有一个表,其中有几个日期字段。例如,在缺陷表中,我有以下内容:dateAssigned、dateCompleted、dateResolved。我正在尝试获取一个查询,该查询总结了以下缺陷: | Number Assigned | Number Completed | Number Resolved -----------------------------+------------------+----------------- Mar-2011 | 33

我有一个表,其中有几个日期字段。例如,在缺陷表中,我有以下内容:dateAssigned、dateCompleted、dateResolved。我正在尝试获取一个查询,该查询总结了以下缺陷:

           | Number Assigned | Number Completed | Number Resolved 
-----------------------------+------------------+-----------------
  Mar-2011 |      33         |        22        |        33        
  Apr-2011 |      10         |        11        |        22
  May-2011 |      22         |        66        |        46

我提出了以下几点,但都无济于事:

SELECT year(d.dateAssigned)
      ,month(d.dateAssigned)
      ,COUNT(d.dateAssigned)
      ,COUNT(d.dateCompleted)
      ,COUNT(d.dateResolved)
  FROM defect d
  GROUP BY year(d.dateAssigned), month(d.dateAssigned)
  ORDER BY year(d.dateAssigned), month(d.dateAssigned)
这对于总结指定日期的缺陷是正确的,但对于其他缺陷则不然。我意识到这可能是因为我是按日期分配分组的,但我不知道怎么做


任何帮助都将不胜感激。

这是一种方法

SELECT YEAR(typedate), 
       MONTH(typedate), 
       SUM(CASE 
             WHEN TYPE = 'assinged' THEN 1 
             ELSE 0 
           END) number_assigned, 
       SUM(CASE 
             WHEN TYPE = 'completed' THEN 1 
             ELSE 0 
           END) number_completed, 
       SUM(CASE 
             WHEN TYPE = 'Resolved' THEN 1 
             ELSE 0 
           END) number_resolved 
FROM   (SELECT dateassigned typedate, 
               'assinged'   AS TYPE 
        FROM   sampledata 
        WHERE  dateassigned IS NOT NULL 
        UNION ALL 
        SELECT datecompleted typedate, 
               'completed'   AS TYPE 
        FROM   sampledata 
        WHERE  datecompleted IS NOT NULL 
        UNION ALL 
        SELECT dateresolved typedate, 
               'Resolved'   AS TYPE 
        FROM   sampledata 
        WHERE  dateresolved IS NOT NULL) data 
GROUP  BY YEAR(typedate), 
          MONTH(typedate) 
ORDER  BY YEAR(typedate), 
          MONTH(typedate) 
子选择将创建两列typedate和type

看起来像这样

typedate type
-------- ---------
1/1/2011 assinged
1/1/2011 assinged
1/1/2011 assinged
2/1/2011 completed
2/1/2011 completed
2/3/2011 Resolved
                        Number_Assigned Number_completed Number_Resolved
----------- ----------- --------------- ---------------- ---------------
2011        1           3               0                0
2011        2           0               2                1
然后我用SUMCASE。。。以透视数据。如果您使用的是支持它的RDBMS,那么您可以使用它

最终输出如下所示

typedate type
-------- ---------
1/1/2011 assinged
1/1/2011 assinged
1/1/2011 assinged
2/1/2011 completed
2/1/2011 completed
2/3/2011 Resolved
                        Number_Assigned Number_completed Number_Resolved
----------- ----------- --------------- ---------------- ---------------
2011        1           3               0                0
2011        2           0               2                1

我将把年和月的格式设置留给您来做

另一种方法是创建一个带有字段的表months:year、month、firstDate、nextMonthFirstDate、,无论是在运行中,还是作为临时表,或者作为永久表,存储了100年和100x12行的表都不会占用太多空间,并且可以方便地用于其他查询,并使用类似的方法,相当于将剩余的月份连接三次到表缺陷:


如果我们在案例别名中使用group by,这是可能的

SELECT CASE 
         WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)!=null) THEN year(TAX_INVOICE_Date)
         WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date) is null) THEN YEAR(Challan_Date)
         WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)is null) THEN 'NA'
         WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date)!= null) THEN year(Challan_Date)
         ELSE year(TAX_INVOICE_Date) END as Dates_Record, TAX_INVOICE_Date, Challan_Date
FROM TransactionRecords 

我看不出一种优雅的方式,但您可以将三个不同的子选择组合在一起,依次分组。希望有人会发布更好的东西。
SELECT CASE 
         WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)!=null) THEN year(TAX_INVOICE_Date)
         WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date) is null) THEN YEAR(Challan_Date)
         WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)is null) THEN 'NA'
         WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date)!= null) THEN year(Challan_Date)
         ELSE year(TAX_INVOICE_Date) END as Dates_Record, TAX_INVOICE_Date, Challan_Date
FROM TransactionRecords