2016-04-21 59 views
2

我认为这应该很简单,但我无法弄清楚或在这里找到解决方案。MySQL - 计数和分组 - 在一行中显示所有结果

我有一个表ITEM_PROPERTIES

item_ID int 
property_name char(20) 
property_value char(20) 

的样本数据

5 Colour Black 
5 Size M 
6 Colour Blue 
6 Size L 
7 Colour Purple 
7 Size M 
8 Colour Blue 
8 Size S 
9 Colour Wine 
9 Size M 

如果我做的:

SELECT property_value, count(property_value) 
FROM ITEM_PROPERTIES where property_name='Colour' 
group by property_value 

我得到:

Black 1 
Blue 2 
Purple 1 
Wine 1 

我怎样才能得到这个在一行,如:

Black 1, Blue 2, Purple 1, Wine 1 

我想:

SELECT group_concat(property_value, count(property_value)) 
FROM ITEM_PROPERTIES where property_name='Colour' 
group by property_value 

SELECT group_concat(concat(property_value, count(property_value))) 
FROM ITEM_PROPERTIES where property_name='Colour' 
group by property_value 

但无论给出错误无效使用组功能的

回答

7
select group_concat(concat(property_value, ' ', cnt)) 
from (
    SELECT property_value, count(property_value) as cnt 
    FROM ITEM_PROPERTIES 
    WHERE property_name = 'Colour' 
    GROUP BY property_value 
) c 
3

可以使用聚合的两个级别:

SELECT group_concat(property_value, ' ', cnt separator ', ') 
FROM (SELECT property_value, count(property_value) as cnt 
     FROM ITEM_PROPERTIES 
     WHERE property_name = 'Colour' 
     GROUP BY property_value 
    ) ip; 
+0

谢谢你们@帕维尔齐莫戈罗夫和戈尔丹 - 我接受了第一个回应,因为两者都是一样的 – KevInSol

+0

@KevIn​​Sol。 。 。 OP可以接受他/她喜欢的任何答案。但是,您可以在时间范围内移动鼠标(“已回答......以前”)。你会看到这个答案比其他答案早2分55秒。 –

0

嘿,请查看下面的函数将是有益的任何之后的版本中的任何查询:

CREATE OR REPLACE FUNCTION "JOIN" 
(
    p_cursor sys_refcursor 
    ,p_del  VARCHAR2:=',' 
) 
RETURN VARCHAR2 
IS 
    l_value VARCHAR2(32767); 
    l_result VARCHAR2(32767); 
BEGIN 
    LOOP 
     FETCH p_cursor INTO l_value; 
     EXIT WHEN p_cursor%NOTFOUND; 
     IF l_result IS NOT NULL 
     THEN 
      l_result:=l_result || p_del; 
     END IF; 
     l_result:=l_result || l_value; 
    END LOOP; 

    close p_cursor; 
    RETURN l_result; 
END JOIN; 

调用此函数使用下面的示例:

SELECT Join(CURSOR(select column from tableName)) FROM DUAL; 

干杯