`
phpxiaoxin
  • 浏览: 252211 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

sql: case when, distinct, group by, group_concat

阅读更多

最近做了个报表,痛苦了半年,终于搞出来了,知道了一些sql用法,

如:

case colom when colom then expr1 else expr2 end, //类似switch case可以有多个when

distinct, group by,//都是取出重复记录的,但是distinct无法显示不重复的其他记录。

mysql的 group_concat(colom SEPARATOR ',') 将字符串字段以分隔符号相连

 

下面是一张机票的表(airTicket)

 

     出发地 到达   往返         机票状态    价格

-------------------------------------------------

id   from    to    back       status       price

----------------------------------------------------

1   a         b      true      confirm   800

----------------------------------------------------

2   c         d      false     cancle     600

----------------------------------------------------

3   c         f      true      cancle     400

----------------------------------------------------

4   a         c      false     confirm    300

 

假设要统计不同状态下的机票的总价格和去过的不同地区,去过的地区就是to的地区,如果是往返的机票,from的也包括。

我的实现如下:

 

select status, count(id), sum(price), group_concat(to),

group_concat(case back when back then from else to end)

from airTicket

group by status; 

 

result:

 

cancel      2    1000      d,f         d,c

-------------------------------------------

confirm    2     1100      b,c        a,c

 

得到上面的字符串之后在计算去过的不同的地区就可以将两个段链接起来,split然后去掉重复的就知道有多少个了。

 

cancel = 3  confirm = 3

 

其实上面语句最复杂的就是统计地区了,需要根据是否是往返机票(back)合并出发地(from)和到达地(to),并且统计出不同的地区。我能实现的方式就是这样了,而且使用了mysql特有的group_concat 方法,如果谁能够替代此方法,请一定回个帖子。

 

通过MySQLDialect 方式让hibernate支持mysql的group_concat

http://hi.baidu.com/ayu1106/blog/item/4da6810efd140ae237d122f3.html

 

==========================================

 

对于distinct和group by是这样一个类似版本管理的记录

 

 

firename         version

-------------------------------

a                      1

-------------------------------

b                      1

-------------------------------

a                      2

 

现在想找到每个文件的最近版本结果如下:

 

a                 2

------------------

b                 1

 

如果使用distinct 可以

select distinct firename from table order by firename, version DESC;

这样只能显示出来firename一列,如果想显示多列,那么可以通过 

 

select firename, version from table t where version =

(select max(version) from table where firename = t.firename)

group by firename

 

其实有高人已经总结了很多方式:

 

http://www.cnblogs.com/kangtr/archive/2008/02/25/1080278.html

 

 

分享到:
评论

相关推荐

    Mysql 行转列,列转行 SQL语句和示例表结构SQL

    MySQL 虽然没有内置的行转列和列转行函数,但通过 CASE、GROUP_CONCAT、UNION ALL 和 JOIN 等 SQL 语句,我们可以灵活地对数据进行转换,满足不同的数据分析需求。在实际应用中,应根据数据的特性和业务需求选择合适...

    SQL develop

    SELECT store_name, CASE WHEN Sales > 1000 THEN 'High Sales' ELSE 'Low Sales' END AS sales_level FROM Store_Information; ``` **算排名 / 算中位数 / 算总合百分比 / 算累积总合百分比** - **用途**: 进行...

    SQL练习,PLSQL练习题目

    例如`CREATE PROCEDURE check_product_quantity(@type VARCHAR(50), @year INT) AS SELECT CASE WHEN SUM(quantity) > standard_value THEN CONCAT(@year, '年', @type, '货物充足') ELSE CONCAT(@year, '年', @...

    sql考试面试题大全(真的很全)

    SELECT guid, GROUP_CONCAT(CASE WHEN id = 1 THEN value ELSE NULL END) AS value1, GROUP_CONCAT(CASE WHEN id = 2 THEN value ELSE NULL END) AS value2, GROUP_CONCAT(CASE WHEN id = 3 THEN value ELSE NULL ...

    实验五-SQL语言.doc

    SELECT CASE WHEN Score >= 90 THEN 'A' WHEN Score >= 80 THEN 'B' WHEN Score >= 70 THEN 'C' WHEN Score >= 60 THEN 'D' ELSE 'F' END AS Grade FROM s_c_info; ``` - **解析**:使用`CASE`语句根据分数范围...

    SQL学习教程

    - **语法**: `SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition;` - **示例**: 找出销售额大于2000美元的店铺。 - **命令**: `SELECT store_name, SUM...

    SQL语句教程大全

    SELECT name, CASE WHEN age > 30 THEN 'Old' ELSE 'Young' END as AgeStatus FROM Customer; ``` #### 六、算排名、算中位数、算总合百分比、算累积总合百分比 这些进阶功能通常涉及到窗口函数,如RANK()、...

    SQL笔试题题目及解析.docx

    SELECT a.day1, COUNT(DISTINCT CASE WHEN day2 - day1 = 1 THEN a.uid END) AS 次留 FROM ( SELECT uid, DATE_FORMAT(dayno, '%Y%m%d') AS day1 FROM aui WHERE app_name = '相机' ) a LEFT JOIN ( SELECT ...

    常用SQL语句解析

    ### 常用SQL语句解析 #### SQL指令概述 SQL(Structured Query ... - **语法**: `SELECT CASE WHEN "条件" THEN "结果" ELSE "结果" END AS "列名" FROM "表名";` - **算排名** - **功能**: 计算记录的排名。 ...

    sql面试题目.doc

    SELECT Rq, '收' AS 方向, SUM(CASE WHEN Fx = '0' THEN Je ELSE 0 END) AS 金额 FROM JKJL GROUP BY Rq UNION ALL SELECT Rq, '付', SUM(CASE WHEN Fx = '1' THEN Je ELSE 0 END) FROM JKJL GROUP BY Rq; ...

    oracle交叉表sql

    - 关闭游标后,完成SQL语句的构建:`set StrSql = CONCAT(StrSql, " from query_area group by jg_id");` 5. **执行动态SQL语句**: - 将完整的查询语句放入变量`@a`中。 - 使用`PREPARE stmt1 FROM @a;`准备SQL...

    解决字符长度8000限制

    SELECT ID = IDENTITY(INT, 0, 1), GroupID = 0, Value = CONCAT('[', Col, '] = SUM(CASE WHEN ', Col, ' THEN Val ELSE 0 END)') INTO #Temp FROM (SELECT DISTINCT Col FROM Table) AS A; -- 按组分批 UPDATE ...

    sql高级进阶

    - 在SELECT语句中使用条件逻辑:利用CASE WHEN等结构实现条件逻辑。 - 限制返回的行数:使用LIMIT子句。 - 从表中随机返回n条记录:结合ORDER BY和LIMIT实现。 - 查找空值:使用IS NULL来定位空值。 - 将空值...

    SQL(Oracle)数据库讲义

    - **CASE函数**: 提供条件判断功能,例如`CASE WHEN 条件 THEN 结果 END`,用于根据条件返回不同的值。 - **分组统计函数**: `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`等函数常与`GROUP BY`子句一起使用,对数据进行...

    SQL基础知识笔记1

    2. 重复值处理:`DISTINCT`去除重复记录,`GROUP BY`配合使用。 3. 数据类型转换:`CAST()`或`CONVERT()`转换数据类型,如`DECIMAL`、`SIGNED`、`CHAR`、`BINARY`、`DATE`、`TIME`和`DATETIME`等。 4. 重命名:使用`...

    简单谈谈MySQL数据透视表

    SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when part_type = ''', part_type, ''' then part_id end) AS part_', part_type, '_id' )) INTO @sql FROM parts; SET @sql = CONCAT('SELECT product_id, ', ...

    hive常用函数参考手册.docx

    - **应用场景**:分区排序、动态Group By、Top N、累计计算、层次查询等。 2. **分析函数**: - `RANK`, `ROW_NUMBER`, `DENSE_RANK`, `CUME_DIST`, `PERCENT_RANK`, `NTILE`等。 - **用途**:在数据集中分配连续...

    hive的优化

    ON CASE WHEN a.user_id IS NULL THEN CONCAT('dp_hive', RAND()) ELSE a.user_id = b.user_id END; ``` - **总结**:第二种方法不仅减少了IO操作,还减少了JOB数量,因此更加高效。 2. **不同数据类型的JOIN...

    SQL-Server常用关键字、数据类型和常用语法.docx

    - **WHEN**:用于 `CASE` 语句中定义条件。 - **VIEW**:创建视图。 - **INDEX**:创建索引。 - **JOIN**:连接两个或多个表。 - **ON**:指定连接条件。 ##### 2. 辅助关键字 这些关键字通常用于支持主要关键字的...

    Hive常用函数

    - **动态 Group By**:在 GROUP BY 语句中使用 CASE 语句,可以根据条件动态分组。 - **Top N**:通过 ORDER BY 和 LIMIT 子句可以获取每个组的前 N 条数据。 - **累计计算**:窗口函数可以实现数据的累计计算,...

Global site tag (gtag.js) - Google Analytics