有没有办法将GROUP BY作为字符串的一部分....
我想创建一个SQLFIDDLE,但它们似乎必须服务器问题,所以我必须在这里看到它....
这将是数据......
CREATE TABLE tblArticle
(
id int auto_increment primary key,
art_id varchar(20),
art_name varchar(30),
art_color varchar(30),
art_type varchar(5)
);
INSERT INTO tblArticle
(art_id, art_name, art_color, art_type)
VALUES
('12345-1','Textile', 'Black','MAT'),
('12345-2','Textile', 'Red','MAT'),
('12345-3','Textile', 'Green','MAT'),
('12345-4','Textile', 'Blue','MAT'),
('54321-1','Textile', 'Black','MAT'),
('54321-2','Textile', 'Red','MAT'),
('54321-3','Textile', 'Green','MAT'),
('54321-4','Textile', 'Blue','MAT');
所以我得到一些像:
| id | art_id | art_name | art_color | art_type |
----------------------------------------------------------
| 1 | 12345-1 | Textile | Black | MAT |
| 2 | 12345-2 | Textile | Red | MAT |
| 3 | 12345-3 | Textile | Green | MAT |
| 4 | 12345-4 | Textile | Blue | MAT |
| 5 | 54321-1 | Textile | Black | MAT |
| 6 | 54321-2 | Textile | Red | MAT |
| 7 | 54321-3 | Textile | Green | MAT |
| 8 | 54321-4 | Textile | Blue | MAT |
| 9 | 9876543 | Textile | White | MAT |
----------------------------------------------------------
我的选择看起来像
Select art_id, art_name FROM tblArticle WHERE art_type = 'MAT' GROUP BY art_name
我需要的是art_id(如果它的-1或-2等等不重要)和art_name进行进一步的查询。
正如你所看到的,我有两个不同的art_id组...我想按他们分组。
所以我得到两组...... 12345和54321.但我甚至不知道如何开始^^
结果:
12345, Textile
54321, Textile
9876543, Textile
我尝试将art_id添加到我的群组中,但具有相同的效果,例如不要使用群组^^
我能做些什么来实现这个目标?
解决方案如下:
SELECT DISTINCT @IF( @SCAN( art_id, '-' ) +1,
@LEFT( art_id, @SCAN( art_id, '-')),
art_id) AS art_id, art_name
FROM tblArticle
WHERE art_type LIKE '%MAT%';
在这种情况下,DISTINCT
与GROUP BY
具有相同的效果。
+1
用于获取0。如果没有找到,它会返回-1。但IF需要0(假)或1+(真)。在我的案例中,永远不会有-
。{/ p>
无法使用GROUP BY,因为它只接受整数或列。
答案 0 :(得分:2)
你可以试试这个,它可以解决短划线的位置和正确分组
Select case when Instr(art_id, '-') = 0
then art_id
else Left(art_id, Instr(art_id, '-') - 1) end, art_name
FROM tblArticle
WHERE art_type = 'MAT'
GROUP BY case when Instr(art_id, '-') = 0
then art_id
else Left(art_id, Instr(art_id, '-') - 1) end
,art_name
答案 1 :(得分:1)
要进行分组,您必须指定要分组的字符串的哪个位。在这种情况下,它是前5个字符,因此您将使用LEFT(art_id,5)
。这必须在SELECT
语句中匹配,因此您需要修改它以阅读相同内容。
我把这个列别名为art_id,否则它将是未知的:
SELECT LEFT(art_id,5) AS art_id, art_name
FROM tblArticle
WHERE art_type = 'MAT'
GROUP BY LEFT(art_id,5), art_name
唯一可能出现问题的是,如果您开始使用大于5个字符的ID。在这种情况下,您需要使用@FIND
来查找短划线并在左侧查找。如果没有破折号,这将崩溃,因为@FIND
函数如果没有找到匹配则返回-1,所以我们必须使用@IF
语句来补偿这一点。
在这种情况下我会写:
SELECT @IF(art_id LIKE '%-%'
,@LEFT(art_id, @FIND('-', art_id, 0) - 1)
,art_id
) AS art_id, art_name
FROM tblArticle
WHERE art_type = 'MAT'
GROUP BY @IF(art_id LIKE '%-%'
,@LEFT(art_id, @FIND('-', art_id, 0) - 1)
,art_id
), art_name
@符号是必要的(至少我认为它们是,如果它不起作用就试试),我之前没有使用SQLBase所以我使用以下官方文档作为指南:
答案 2 :(得分:0)
如果您不关心其他列,则意味着执行分组将从其他列中选择随机值art_name
,它可以是来自art_id
之一的随机值,您可以使用如
select
substring_index(art_id,'-',1) as atr_id_val ,
art_name
from tblArticle
where art_type = 'MAT'
group by atr_id_val ;
如果您需要选择所有列,并且需要确保所有列都来自number-{1 or 2}
的最后一个条目,您可以将其用作
select
t1.id,
substring_index(t1.art_id,'-',1) as art_id,
t1.art_name ,
t1.art_color ,
t1.art_type from tblArticle t1
left join tblArticle t2 on substring_index(t2.art_id,'-',1) = substring_index(t1.art_id,'-',1) and t1.id < t2.id and t1.art_type = 'MAT' where t2.id is null ;
答案 3 :(得分:0)
art_id修剪需要包括在选择中我也相信。
Select left( art_id, iif(CHARINDEX('-',art_id) > 0,CHARINDEX('-',art_id)-1, len(art_id) )) art_id, art_name
FROM tblArticle
WHERE art_type = 'MAT'
GROUP BY left ( art_id, iif(CHARINDEX('-',art_id) > 0,CHARINDEX('-',art_id)-1, len(art_id) ))
,art_name