2017-06-12 67 views
0

我的數據是這樣的:計數鮮明月與多個記錄每月

Code Date 
123  1/2/2016 
123  1/4/2016 
123  1/4/2016 
123  2/5/2016 
456  1/2/2016 
456  1/3/2016 
456  2/7/2016 
789  1/7/2016 
789  1/8/2016 
789  3/7/2016 
789  3/15/2016 

我要找的代碼分組個月的重複計數。

所以結果會是這個樣子

Code  Jan2016  Feb2016  Mar2016 
123   1   1   0 
456   1   1   0 
789   1   0   1 

我覺得我可能會過於複雜我的代碼。

到目前爲止,我有

SELECT 
    p.code 
    ,SUM(CASE WHEN p.date BETWEEN '11/1/2010' AND '11/30/2010' 
    THEN 1 ELSE 0 END) AS 'Nov2010' 
    FROM table 
    Group By p.code 

但畢竟是從Nov2010,所有記錄拉着我只需要知道如果存在的話

+0

您正在使用哪個[DBMS](https://en.wikipedia.org/wiki/DBMS)? Postgres的?甲骨文? –

回答

0

你可以改變你的聚合函數。使用MAX而不是SUM

SELECT 
    p.code 
    ,MAX(CASE WHEN p.date BETWEEN '11/1/2010' AND '11/30/2010' 
    THEN 1 ELSE 0 END) AS 'Nov2010' 
FROM table 
Group By p.code 
+0

如果月份內有重複的MAX日期,將使用MAX嗎? – baineschile

+0

@baineschile'MAX'被應用於'CASE'而不是日期列。如果該月內至少有一行,則MAX函數返回1,否則返回0。那是你要的嗎? – danielsepulvedab

+0

那就是我想要的。但是,如果有兩個記錄具有相同的最大日期(即12/13/2016),那麼會計數兩次? – baineschile

0

在SQL Server中,你可以使用數據透視表,有點亂,但這樣的事情會工作,樣本數據:

declare @table table (code int, date date) 
insert into @table values 
(123, '1/2/2016'), 
(123, '1/4/2016'), 
(123, '1/4/2016'), 
(123, '2/5/2016'), 
(456, '1/2/2016'), 
(456, '1/3/2016'), 
(456, '2/7/2016'), 
(789, '1/7/2016'), 
(789, '1/8/2016'), 
(789, '3/7/2016'), 
(789, '3/15/2016') 

然後使用數據透視表:

with cte (code) as (select distinct code from @table) 

select 
    c1.code, 
    ISNULL(months.[1],0) as 'Jan 2016', 
    ISNULL(months.[2],0) as 'Feb 2016', 
    ISNULL(months.[3],0) as 'Mar 2016' 
from 
    (
    select 
    c.code, 
    count(distinct t.code) as [ID], 
    month(date) as [month] 
    from @table t 
    join cte c on t.code = c.code 
    group by c.code, month(date) 
    ) P 
pivot 
    (
    sum([ID]) 
    for [month] IN ("1","2","3")--,"4","5","6","7","8","9","10","11","12") 
    ) as months 
    join cte c1 on months.code = c1.code 

會給你以下結果:

code Jan 2016 Feb 2016 Mar 2016 
123   1   1   0 
456   1   1   0 
789   1   0   1 

如果您在第3個月後將註釋取出,則可以在今年的其餘時間內執行此操作

+0

我很欣賞反饋,但這不會奏效。我有幾百萬行看。我只是給出了一個上下文的基本示例。 – baineschile

+0

@baineschile它會做任何數量的行相同的邏輯,我只是​​展示了樣本數據,因爲我在查詢中使用臨時表 – dbajtr

+0

只是將查詢中的'from @table'更改爲您的表名,將註釋取出數據透視表獲取剩餘月份並將其添加到select中 – dbajtr