2015-01-08 59 views
1

我试图在一个表中获取两个单独列的数据。通过同一分组计算2列

我有一个跟踪问题的数据库,一个问题表有两个相关的列,每个列都包含一个日期。非常类似于以下内容。

DateOpened DateClosed 
2015-01-08 2015-01-08 
2015-01-08 2015-01-08 
2015-01-06 2015-01-08 
2015-01-06 2015-01-08 
2015-01-04 2015-01-07 
2015-01-02 2015-01-07 
2015-01-02 2015-01-07 

我的目标是能够计算每个日期打开和关闭的条目数。上述预期产出的一个例子是。

Date   CountDateOpened CountDateClosed 
2015-01-08 2    4 
2015-01-07 0    3 
2015-01-06 2    0 
2015-01-05 0    0 
2015-01-04 1    0 
2015-01-03 0    0 
2015-01-02 2    0 

我知道我需要按日期,但应该有天,其中更多的问题比开闭,但我COUNT(DateClosed)似乎从来没有超过我的伯爵(DateOpened)。我正在处理查询中的飞行日期转换,但我不相信它们是相关的,因为我总是轮到最近的一天。以下是我目前运行的查询,为简单起见而剥皮。

SELECT 
    CREATEDATE AS [Date], 
    COUNT(CREATEDATE) AS [Number Opened], 
    COUNT(CLOSEDATE) AS [Number Closed] 

FROM 
    ISSUE 

GROUP BY 
    CREATEDATE 

ORDER BY 
    [Date] DESC 

回答

3

这样做的一种方法是使用union all创建两个日期,然后根据其类型组一列:

SELECT `Date`, 
     COUNT(`open`) AS `CountDateOpened` 
     COUNT(`closed`) AS `CountDateClosed` 
FROM  (SELECT `DateOpened` AS `Date`, 1 AS `open`, NULL AS `closed` 
      FROM `issue` 
      UNION ALL 
      SELECT `DateClosed` AS `Date`, NULL AS `open`, 1 AS `closed` 
      FROM `issue` 
     ) t 
GROUP BY `Date` 
ORDER BY `Date` DESC 
+0

精解。只需要“ORDER BY date DESC” – twyly

+0

@twylyc错过了OP的查询中的'order by' - 编辑和添加。感谢您指出! – Mureinik

+1

这将不会在输出中包含“2015-01-05”和“2015-01-03”,因为它不存在于表 –

1

试试这个

select 
d.dt,(select COUNT(DateOpened) ct from ISSUE where 
CAST(DateOpened as DATE)=CAST(d.dt as DATE)) 
,(select COUNT(DateClosed) ct from ISSUE where 
CAST(DateClosed as DATE)=CAST(d.dt as DATE)) 
from (
select number,DATEADD(D,number-7,GETDATE()) dt 
from master.dbo.spt_values sp 
where type='P' and DATEADD(D,number-7,GETDATE())<'2015-01-09' 
) 
d 
ORDER BY d.dt desc 

OUTPUT

Date  DateOpened DateClosed 
2015-01-08 2   4 
2015-01-07 0   3 
2015-01-06 2   0 
2015-01-05 0   0 
2015-01-04 1   0 
2015-01-03 0   0 
2015-01-02 2   0 
+0

中,这非常麻烦。看到工会的想法。 – Strawberry

+0

@Strawberry是的......但他应该使用数字表,否则它会错过'2015-01-05'和'2015-01-03' –

0

同Mureinik的回答,只是少一点打字...

SELECT date,SUM(status='opened') opened, SUM(status = 'closed') closed 
    FROM 
    (SELECT dateopened date,'opened' status FROM my_table 
     UNION ALL 
     SELECT dateclosed,'closed' FROM my_table 
    ) x 
GROUP 
    BY date DESC;