2015-04-29 43 views
1

我试图找到一个MySQL查询,它将显示一年内ID值的出现次数。MySQL:计数不同值的发生

表:

a_id  year 
----  ---- 
1  2010 
1  2011 
1  2012 
1  2012 
1  2013 
1  2014 
1  2015 
2  2010 
2  2011 
2  2013 
2  2014 
2  2014 
2  2015 
3  2010 
3  2010 
3  2011 

预期输出:

a_id year occurrences 
---- ----- ----------- 
1  2010  1 
1  2011  1 
1  2012  2 
1  2013  1 
1  2014  1 
1  2015  1 
2  2010  1 
2  2011  1 
2  2013  1 
2  2014  2 
2  2015  1 
3  2010  2 
3  2011  1 

我想沿着下面的SQL查询的线条的东西,但它给了我没有像预期的输出。这是我在努力的第三列。

SELECT a__id, year, count(distinct a_id) as occurrences 
FROM table1 
GROUP by year 
ORDER by a_id 

如何创建第3列?

+2

更改为计数(*) –

+0

您没有PRIMARY KEY。及时,这将证明有问题。 – Strawberry

+0

@Giorgi Nakeuri给出了一个完美的答案,只需经过一次,根据您的要求,似乎没问题。 –

回答

0

斯科特你正在按a_idyear分组,你当然只能得到1组不同的价值。只需将count(distinct a_id)更改为count(*)即可。

例如你组:本组不同A_ID值

1  2012 
1  2012 

通知是1,但要在组中的所有行数。与distinct你会得到1在所有组中发生。

编辑

好吧,我已经错过了,你只能通过year分组,让你通过a_id还应组。答案的其余部分保持原样。所以你最终得到:

SELECT a__id, year, count(*) as occurrences 
FROM table1 
GROUP by a__id, year 
+0

完美!奇迹般有效。谢谢!并感谢有关独特的解释。我恰好在之前使用count(*)来尝试,但是我没有按a_aid分组,只有一年。 –

0

使用以下将让你找到你想要的。

SELECT a_id, year, count(*) 
FROM table1 
GROUP BY a_id, year 
ORDER BY a_id, year 

尽管在以前的版本中,ORDER BY可能已经被MySQL保证,但现在已被弃用。如果您想确保您的结果重新排序,请添加ORDER BY。 '未来你'会为此感谢你。

+0

ORDER BY在这个特定的上下文中是多余的,但在其他方面很好。 – Strawberry

+0

如何? MySQL强制执行ORDER BY吗?我总是宁愿明确,然后假设。 –

+0

是的。它确实有效,但在“腰带和大括号”方法中无损 – Strawberry

0
SELECT a__id, year, count(*) as occurrences 
FROM table1 
GROUP by a__id, year