使用SQL实现交叉表

年前去面试时,被问到这样一个 sql 题目: 有张表,统计了 部门、月份、盈利这三个主要数据,要求仅使用 SQL 作出一张以部门和月份为分组的交叉表。 显然俺是被难住了,之前看项目组里一个大牛有写过,但也没有去记住细节,这个问题,要是把12个月份作为字段写死,其实倒还挺容易解决,不过意义不大,自然是要寻求一个能够通用的解决方法了。 要想数据库中的值动态地构造列,使用简单的 sql 自然是无法达到的,必须得借助变量循环什么的才靠谱,几经摸索,搞出了 mysql 的实现。 set @sql:= ‘select department ‘; select @sql:=concat(@sql, ‘, sum(if(month=\”, month, ‘\’, income, 0)) as \”, month, ‘\”) from (select distinct month from test order by month) t1; set @sql:=concat(@sql, ‘ from test group by department;’); prepare statement from @sql; execute statement; 查询结果: [...]

SQLAlchemy使用sqlite查询随机结果

最近公司项目接受尾声,有时闲有时忙的,于是就用 bottle 写个美丽人物玩玩,因为东西很小,就使用  sqlite 整了, orm使用的是闻名的 SQLAlchemy。 美丽人物这种东东除了显示当前图片外,还会随机推荐一些其它的人物(那自然是美女了),需要随机返回一些结果呈现给用户。 SQLAlchemy 自然是提供了这种支持的,不过不同的数据库的用法可能会有所不同,sqlite 的方法如下: from sqlalchemy import func … session.query(Item.item_name).order_by(func.random()) 其实是调用 sqlite 的 random() 函数。 这里给出一个完整的例子做参考: from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session from sqlalchemy import (create_engine, MetaData, Column, Integer, String) from sqlalchemy import func Base = declarative_base() class Item(Base): __tablename__ = ‘items’ item_id = Column(Integer, primary_key=True, autoincrement=True) [...]

Alter Table Add Column

非常反感客户在项目后期还不停要加东西,比如经常需要增加字段,之前都是用可视化的数据库管理工具,没有在Sql  Server中直接使用sql向表中添加过字段,语气什么的吧,自然是记不住了,Google了一下 ,发现很多文章中都这样写: ALTER TABLE PM_PROJECT ADD COLUMN PROJECTINCOMETYPE_ VARCHAR(255) NULL 结果总是报“ADD COLUMN附近有语法错误”,莫名其妙,还以为是之后的语句有问题呢,再次Google后才一篇文章中看到原来语法中不加COLUMN的。 正确的用法: ALTER TABLE PM_PROJECTADD PROJECTINCOMETYPE_ VARCHAR(255) NULL 如果是添加多个字段,用逗号隔开: (此段代码摘录自:http://sqlserverplanet.com/sql/alter-table-add-column/) CREATE TABLE dbo.Employees ( EmployeeID int IDENTITY (1,1) NOT NULL PRIMARY KEY NONCLUSTERED ) GO ALTER TABLE dbo.Employees ADD FirstName varchar(50) NULL ,LastName varchar(50) NULL ,SSN varchar(9) NULL CONSTRAINT ssn_unique UNIQUE ,IsTerminated bit [...]

将Excel中的数据转成sql脚本

用户经常给一些Excel文件的数据,让我们录入到系统中,作数据初始化,录数据其实是一项相当无聊的工作,一个不注意还容易出错,不过聪明的程序员总能让事情变得有趣起来。 在Java中,使用PreparedStatement或者Hibernate的hql,经常都会碰到类似如下形式的参数绑定。 select * from table_names where id = ? from Employee emp where emp.deptName = :detpName 其实如果是规则的excel文件,我们也可以利用类似的机制将其中的数据批量导成sql,然后在数据库管理工具中直接执行,来简化数据录入。 比如有张表如下: 姓名    性别    省份    地址 —–  —–   —–  ————————– 张三    男 陕西 陕西西安 李四 女 黑龙江 黑龙江鸡西 王八 帝 景德镇 景德镇根据地 如果想把里面的数据插入到hr_emps表中,只要指定sql语句模板 insert into hr_emps(name, gender, prov, addr) values(‘:0′, ‘:1′, ‘:2′, ‘:3′); [...]