2012-10-12 45 views
1

这里是我的表:集团通过部分字符串

----------+-----------+-------------- 
45678-sm-w| 18  | Mens clothing 
----------+-----------+-------------- 
45678-sm-b| 5  | Mens clothing 
----------+-----------+-------------- 
2189-L-Wh | 4  | Juniors Clothing 
----------+-----------+-------------- 
2189-L-Bl | 3  | Juniors Clothing 
----------+---------- +-------------- 

这是期望的结果是什么:

----------+-----------+-------------- 
45678  | 23  | Mens clothing 
----------+-----------+-------------- 
2189  | 7  | Juniors Clothing 
----------+-----------+-------------- 
+0

您可以按第三列进行分组吗? – jmilloy

回答

3

你可以改变表?它将使最有意义的分裂col1三个栏(如idsize,并且color)修改表,让你可以通过新的id栏目组:

-----+----+----+-----------+-------------- 
45678| sm | w | 18  | Mens clothing 
-----+----+----+-----------+-------------- 
45678| sm | b | 5  | Mens clothing 
-----+----+----+-----------+-------------- 
2189 | L | Wh | 4  | Juniors Clothing 
-----+----+----+-----------+-------------- 
2189 | L | Bl | 3  | Juniors Clothing 
-----+----+----+---------- +-------------- 

你可以做到这一点使用ALTER TABLE添加所需的三列并更改主键,使用SUBSTRING_INDEXUPDATE提取并存储拆分值,并使用另一个ALTER TABLE进行清理。事情是这样的:

ALTER TABLE t 
DROP PRIMARY KEY; 

ALTER TABLE T 
ADD id INT UNSIGNED NOT NULL, 
ADD size VARCHAR(255), 
ADD color VARCHAR(255), 
ADD PRIMARY KEY (col1); 

UPDATE TABLE t 
SET id = CONVERT(SUBSTRING_INDEX(col1, '-', 1), UNSIGNED INTEGER), 
SET size = SUBSTRING_INDEX(col1, '-', 2), 
SET color = SUBSTRING_INDEX(col1, '-', 3); 

ALTER TABLE t 
DROP COLUMN col1; 

如果你不能改变的表,你可以提取需要使用SUBSTRING_INDEX ID号:

SELECT SUBSTRING_INDEX(col1, '-', 1), col2, col3 FROM table; 

给出:

-----+-----------+-------------- 
45678| 18  | Mens clothing 
-----+-----------+-------------- 
45678| 5  | Mens clothing 
-----+-----------+-------------- 
2189 | 4  | Juniors Clothing 
-----+-----------+-------------- 
2189 | 3  | Juniors Clothing 
-----+---------- +-------------- 

对于最终查询,我会使用一个SELECT来提取您需要的id,以及一个外部SELECT分组:

SELECT id, SUM(col2) AS total, col3 
FROM 
    (SELECT SUBSTRING_INDEX(col1, '-', 1) AS id, col2, col3 
    FROM table) AS t 
GROUP BY id 
0

CAST第一列数字,添加一个索引到新创建的列并在该列上按总和运行一个组。

update table set `left`=CAST(col1 AS SIGNED); 

select `left`,sum(*),`col3` from table; 
+0

我同意泰勒应该改变表格,但不是这样。如果要更改表格,请正确完整地执行此操作:将col1分成三列:'id','size'和'color'。然后你只需用'id'分组。 – jmilloy

+0

我会如何将它分成三列? –

5

如果您选择的数据,那么你可以使用这样的事情:

select SUBSTRING_INDEX(col1, '-', 1) col1, 
    sum(col2) Total, 
    col3 
from table1 
group by SUBSTRING_INDEX(col1, '-', 1), SUBSTRING_INDEX(col3, ' ', 1) 
order by col1 desc 

SQL Fiddle With Demo

+0

我可能会使用它并将其转化为供以后参考的视图 –