作者grence (多想两分钟 = =")
看板Database
标题Re: [SQL ] 请问这个选择语法
时间Tue Oct 21 21:57:05 2008
※ 引述《vizshala (Mein Gott!!)》之铭言:
: 假设有table资料如下
: tb1
: ---------------------------------------------------
: 帐号 订购编号 日期
: ---------------------------------------------------
: User Item OrderDate
: ---------------------------------------------------
: User1 Item0 2008-10-10 10:00:00
: User1 Item1 2008-10-10 10:00:00
: User2 Item0 2008-10-10 10:00:00
: User2 Item0 2008-10-10 10:00:00
: User2 Item1 2008-10-10 10:00:00
: User3 Item1 2008-10-10 10:00:00
: User3 Item2 2008-10-10 10:00:00
: User4 Item3 2008-10-10 10:00:00
: User5 Item0 2008-10-10 10:00:00
: User5 Item0 2008-10-10 10:00:00
: User5 Item1 2008-10-10 10:00:00
: 要怎麽产生各个User对应的Item数目报表,想要统计各个User订购的项目
: Item0 Item1 Item2 Item3
: User1 1 1
: User2 2 1
: User3 1 1
: User4 1
: User5 2 1
: 请问语法该怎麽下,使用MS-SQL
: 如果使用
: Select User, count(item) from tb1 只能获得该使用者全部的订购数
: 该如何产生各个项目的统计呢
: 刚刚试了一下
: select User,
: sum(i0) as count_i0,
: sum(i1) as count_i1,
: sum(i2) as count_i2,
: sum(i3) as count_i3 from
: (
: select User,
: case Item
: when 0 then count(Item)
: else 0
: end as i0,
: case Item
: when 1 then count(Item)
: else 0
: end as i1,
: case Item
: when 2 then count(Item)
: else 0
: end as i2,
: case Item
: when 3 then count(Item)
: else 0
: end as i3,
^这个会错吧?
: from tb1 group by User
: ) as list_1
: group by User
: 可以产生想要的结果,不过语法似乎不够简洁,效能可能也有问题
语法要简洁可以查询 PIVOT的用法…SQL SERVER 2005之後才有的样子;
现在没说怎麽用是因为…我忘记怎麽用了XD
我觉得 PIVOT的用法不合我的直觉,也不一定比较快,
所以不常用,但 SQL写完确实会比较短。
往回看了几篇文章,直的(资料列)要转横(栏位)的通常都可以使用sum(case...)
效能嘛…多想几种写法,然後实验吧!变因似乎不少…提供另一种
select User,
SUM(case Item
when 0 then 1
else 0
end) as i0,
SUM(case Item
when 1 then 1
else 0
end) as i1,
SUM(case Item
when 2 then 1
else 0
end) as i2,
SUM(case Item
when 3 then 1
else 0
end) as i3
from tb1 group by User
大概是这样,可以少一个 group by,不确定能否直接用,看懂再试着改看看
也不确定会不会比较快
: 想请问是否有更好的作法
: 谢谢
: ※ 编辑: vizshala 来自: 59.124.66.91 (10/21 14:33)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.206.51
※ 编辑: grence 来自: 61.229.206.51 (10/21 22:07)