最近做了个报表,痛苦了半年,终于搞出来了,知道了一些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 虽然没有内置的行转列和列转行函数,但通过 CASE、GROUP_CONCAT、UNION ALL 和 JOIN 等 SQL 语句,我们可以灵活地对数据进行转换,满足不同的数据分析需求。在实际应用中,应根据数据的特性和业务需求选择合适...
SELECT store_name, CASE WHEN Sales > 1000 THEN 'High Sales' ELSE 'Low Sales' END AS sales_level FROM Store_Information; ``` **算排名 / 算中位数 / 算总合百分比 / 算累积总合百分比** - **用途**: 进行...
例如`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, '年', @...
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 ...
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`语句根据分数范围...
- **语法**: `SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition;` - **示例**: 找出销售额大于2000美元的店铺。 - **命令**: `SELECT store_name, SUM...
SELECT name, CASE WHEN age > 30 THEN 'Old' ELSE 'Young' END as AgeStatus FROM Customer; ``` #### 六、算排名、算中位数、算总合百分比、算累积总合百分比 这些进阶功能通常涉及到窗口函数,如RANK()、...
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(Structured Query ... - **语法**: `SELECT CASE WHEN "条件" THEN "结果" ELSE "结果" END AS "列名" FROM "表名";` - **算排名** - **功能**: 计算记录的排名。 ...
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; ...
- 关闭游标后,完成SQL语句的构建:`set StrSql = CONCAT(StrSql, " from query_area group by jg_id");` 5. **执行动态SQL语句**: - 将完整的查询语句放入变量`@a`中。 - 使用`PREPARE stmt1 FROM @a;`准备SQL...
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 ...
- 在SELECT语句中使用条件逻辑:利用CASE WHEN等结构实现条件逻辑。 - 限制返回的行数:使用LIMIT子句。 - 从表中随机返回n条记录:结合ORDER BY和LIMIT实现。 - 查找空值:使用IS NULL来定位空值。 - 将空值...
- **CASE函数**: 提供条件判断功能,例如`CASE WHEN 条件 THEN 结果 END`,用于根据条件返回不同的值。 - **分组统计函数**: `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`等函数常与`GROUP BY`子句一起使用,对数据进行...
2. 重复值处理:`DISTINCT`去除重复记录,`GROUP BY`配合使用。 3. 数据类型转换:`CAST()`或`CONVERT()`转换数据类型,如`DECIMAL`、`SIGNED`、`CHAR`、`BINARY`、`DATE`、`TIME`和`DATETIME`等。 4. 重命名:使用`...
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, ', ...
- **应用场景**:分区排序、动态Group By、Top N、累计计算、层次查询等。 2. **分析函数**: - `RANK`, `ROW_NUMBER`, `DENSE_RANK`, `CUME_DIST`, `PERCENT_RANK`, `NTILE`等。 - **用途**:在数据集中分配连续...
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...
- **WHEN**:用于 `CASE` 语句中定义条件。 - **VIEW**:创建视图。 - **INDEX**:创建索引。 - **JOIN**:连接两个或多个表。 - **ON**:指定连接条件。 ##### 2. 辅助关键字 这些关键字通常用于支持主要关键字的...
- **动态 Group By**:在 GROUP BY 语句中使用 CASE 语句,可以根据条件动态分组。 - **Top N**:通过 ORDER BY 和 LIMIT 子句可以获取每个组的前 N 条数据。 - **累计计算**:窗口函数可以实现数据的累计计算,...