SQL 按 3 列分组,具有特殊功能

标签 sql select sqlite group-by

我有一个包含 name、color1、color2、color3 和其他列(SQLite)的表:

CREATE TABLE data (name TEXT, lvlavailable INTEGER, lvlExtra TEXT,
color1 TEXT, color2 TEXT, color3 TEXT);

当前数据

INSERT INTO "someTable" VALUES ("name","Amarillo","NoColor","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","NoColor","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Azul","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Azul","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Rojo","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Rojo","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Rojo","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Rojo","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Rojo","Verde");
INSERT INTO "someTable" VALUES ("name","Amarillo","Verde","NoColor");
INSERT INTO "someTable" VALUES ("name","Amarillo","Violeta","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","NoColor","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","NoColor","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","Amarillo","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","Amarillo","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","Amarillo","NoColor");
INSERT INTO "someTable" VALUES ("name","Azul","Amarillo","Rojo");

本例中的列名称不相关 *我知道由于列数的原因插入不正确,但我认为您明白了*

当前选择语句:

SELECT name, 
       color1, 
       CASE WHEN color2 = 'NoColor' THEN '' ELSE color2 END as color2, 
       CASE WHEN color3 = 'NoColor' THEN '' ELSE color3 END as color3 
 FROM someTable 
 GROUP BY color1,color2,color3,name

案件用于其他目的

当前结果:

name    Amarillo        
name    Amarillo        
name    Amarillo    Azul    
name    Amarillo    Azul    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo            Verde
name    Amarillo    Verde   
name    Amarillo    Violeta 
name    Azul        
name    Azul        
name    Azul            Amarillo    
name    Azul            Amarillo    
name    Azul            Amarillo    
name    Azul            Amarillo    Rojo

颜色名称是西类牙语,抱歉

期望的结果:

name    Amarillo        
name    Amarillo        
name    Amarillo    Azul    
name    Amarillo    Azul
name    Azul            Amarillo    
name    Azul            Amarillo    
name    Azul            Amarillo
name    Azul            Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo    
name    Amarillo    Rojo            Verde
name    Amarillo    Verde   
name    Amarillo    Violeta 
name    Azul        
name    Azul        

请注意,当它获取组 Amarillo,Azul,[empty] 时,它将继续 Amarillo,Azul,其中独立的列是每种颜色,但我想保持原始颜色列位置,如图所示,但我不这样做不想创建另一列,只是订购了。

所以,我想要的是将那些具有相同颜色但顺序不同的组放在一起。

这可能吗?

最佳答案

尝试:

select name, 
       color1, 
       case color2 when 'NoColor' then '' else color2 end as colour2, 
       case color3 when 'NoColor' then '' else color3 end as colour3
from data
order by
       case 
           when color2 = 'NoColor' then color1 
           when color3 = 'NoColor' then min(color1, color2)
           else min(color1,color2,color3)
       end,
       case
           when color2 = 'NoColor' then ''
           when color3 = 'NoColor' then max(color1, color2)
           else max(min(color1,color2),min(color1,color3),min(color2,color3))
       end,
       case color3
           when 'NoColor' then ''
           else max(color1,color2,color3)
       end

SQLFiddle here .

关于SQL 按 3 列分组,具有特殊功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147240/

相关文章:

SQLite:通过一次替换复制前一行的所有值

python - SQlite UPDATE WHERE语法错误

python - 我应该对派生表使用 LEFT JOIN、RIGHT JOIN、不同的表设计还是需要编码?

mysql - 在 MySQL 中获取 2 个值的总和(1 在子查询中)

sql - 使用 LIMIT 对 SQLite 进行分页

java - 计算当前连胜 - sqlite

MySQL:如何获取最后一条记录?

mysql - 如何将时间列分别分组为 5 分钟间隔和最大/最小值 SQL?

javascript - 选择 1 更新选择 2,但选择 2 不触发

jQuery 选择/取消选择所有同级