2011-12-20 41 views
0

我有如下表:MySQL的 - 複雜的查詢W/GROUP_CONCAT ...單表

id | billingno | location 
------------------------- 
1 | 9999999 | Toronto 
2 | 9999999 | Toronto 
3 | 7777777 | Toronto 
4 | 7777777 | Quebec 

我需要一個查詢,會產生我的東西,看起來像這樣:

location | total | display 
-------------------------- 
Toronto | 3  | 9999999 - 2, 7777777 - 1 
Quebec | 1  | 7777777 - 1 

所以,它按位置分組,顯示該位置的billingno的總數,然後顯示列將列出每個billingno以及它們在該位置的次數。我一直在嘗試寫這一段時間,我最親密的嘗試是這樣的:

SELECT location, COUNT(*) AS total, GROUP_CONCAT(DISTINCT CAST(CONCAT(CONVERT(billingno,CHAR(16)), ' - ', THIS_COUNT_PART_FOR_EACH_LOCATION_IN_DISPLAY_DOESNT_WORK)AS CHAR) 
SEPARATOR ' - ') AS display 
FROM table GROUP BY location 
ORDER BY COUNT(*) DESC 

它給了我一切,我需要的只是我不能爲我的生活弄清楚如何算下顯示每個billingno的數量。如果我使用COUNT(),它會給我一個關於分組的錯誤。請幫忙!

哦,我也必須使用轉換爲字符,所以它會顯示爲文本,而不是phpMyAdmin中的BLOB。再次感謝!

+0

對不起,但你的代碼是不可讀的。糾正它。您也可以在代碼塊中添加表格。 – piotrekkr 2011-12-20 18:56:40

+0

更正 - 我複製/粘貼它,這一切都變成了地獄,應該會更好 - 對不起! – 2011-12-20 19:09:06

回答

1

的樣本數據:

create table location (
    id int, 
    billingno varchar(10), 
    location varchar(10) 
); 

insert into location 
select 1, '9999999', 'Toronto' union 
select 2, '9999999', 'Toronto' union 
select 3, '7777777', 'Toronto' union 
select 4, '7777777', 'Quebec' ; 

查詢:

select 
    location, 
    sum(qty) as total, 
    group_concat(concat(billingno, ' - ', cast(qty as char(7))) 
     order by qty desc separator ', ' 
    ) as display 
from (
    select billingno, location, count(*) as qty 
    from location 
    group by billingno, location 
) t 
group by location 
order by total desc 

結果:

location total display 
Toronto  3  9999999 - 2, 7777777 - 1 
Quebec  1  7777777 - 1 
+0

你先生,是救命恩人! 非常非常感謝。 – 2011-12-20 19:40:02

0

這個怎麼樣,

SELECT table.location, 
     SUM(LocationCount) AS Total, 
     GROUP_CONCAT(CAST(CONCAT(CONVERT(billingno,CHAR(16)), ' - ', THIS_COUNT_PART_FOR_EACH_LOCATION_IN_DISPLAY_DOESNT_WORK)AS CHAR) 
SEPARATOR ' - ') AS display 
FROM table 
    LEFT JOIN 
    (SELECT location , COUNT(id) AS LocationCount 
     FROM table 
     GROUP BY location) t on t.location = table.location 
GROUP BY location 
ORDER BY SUM(LocationCount) DESC 
0
SELECT location, SUM(total) AS total, GROUP_CONCAT(CONCAT(billingno, ' - ', billing_count)) AS display 
FROM (

SELECT location, COUNT(billingno) AS total, billingno, COUNT(billingno) AS billing_count 
FROM billing 
GROUP BY location, billingno 
ORDER BY COUNT(*) DESC 
) AS t 
GROUP BY location