免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2556 | 回复: 5
打印 上一主题 下一主题

请教一个查询语句或方法: [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-14 23:23 |只看该作者 |倒序浏览
10可用积分
请教一个查询语句或方法:

连锁店共有五家分店,每月进货次数不定,销售数据如下:

门店        进货时间        进货数量
一店        20080701        100
一店        20080717        200
二店        20080708        200
四店        20080703        200
四店        20080711        100
四店        20080722        100

当我查询7月累计进货数量时,我用 select 门店,sum(进货数量) where 进货时间>='20080701' and 进货时间 <='20080731' group by 门店;  会得到如下结果:

一店        300
二店        200
四店        400

其中三店和五店因为7月没有进货,所以不会显示。

如果我希望没有进货的门店(三店、五店在7月之前都曾有过进货)能够直接显示为0,例如:

一店        300
二店        200
三店        0
四店        400
五店        0

请问如何实现?可能实现吗?
谢谢。

最佳答案

查看完整内容

你需要重新规划一下表结构:

论坛徽章:
0
2 [报告]
发表于 2008-08-14 23:23 |只看该作者
你需要重新规划一下表结构:

mysql> SELECT * FROM store_tab;
+---------+------+
| storeid | name |
+---------+------+
|       1 | 一店 |
|       2 | 二店 |
|       3 | 三店 |
|       4 | 四店 |
|       5 | 五店 |
+---------+------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM data_tab;
+--------+---------+----------+------+
| dataid | storeid | idate    | inum |
+--------+---------+----------+------+
|      1 |       1 | 20080701 |  100 |
|      2 |       1 | 20080717 |  200 |
|      3 |       2 | 20080708 |  200 |
|      4 |       4 | 20080703 |  200 |
|      5 |       4 | 20080711 |  100 |
|      6 |       4 | 20080722 |  100 |
+--------+---------+----------+------+
6 rows in set (0.00 sec)

mysql> SELECT a.name, IFNULL( sum( b.inum ) , 0 ) AS cnt
&nbsp;&nbsp;&nbsp;&nbsp;-> FROM store_tab a
&nbsp;&nbsp;&nbsp;&nbsp;-> LEFT JOIN data_tab b ON a.storeid = b.storeid
&nbsp;&nbsp;&nbsp;&nbsp;-> AND idate >= '20080701'
&nbsp;&nbsp;&nbsp;&nbsp;-> AND idate <= '20080731'
&nbsp;&nbsp;&nbsp;&nbsp;-> GROUP BY a.storeid;
+------+-----+
| name | cnt |
+------+-----+
| 一店 | 300 |
| 二店 | 200 |
| 三店 |   0 |
| 四店 | 400 |
| 五店 |   0 |
+--- --+-----+
5 rows in set (0.00 sec)

论坛徽章:
0
3 [报告]
发表于 2008-08-15 11:14 |只看该作者
select temp_a.店名,ifnull(temp_b.sum_temp,0) from (select distinct 店名 from  表名) as temp_a left join (select 门店,sum(进货数量) as sum_temp  from 表名 where 进货时间>='20080701' and 进货时间 <='20080731' group by 门店) as temp_b on temp_a.店名=temp_b.门店;

论坛徽章:
0
4 [报告]
发表于 2008-08-18 16:33 |只看该作者
先谢谢,赶紧回家试试……

论坛徽章:
0
5 [报告]
发表于 2008-08-19 11:34 |只看该作者
经过测试,以上两个语句都可用,非常感谢。

不过这两种查询,哪种会更快一点呢?

我用phpmyadmin来运行以上两个查询,

第一次运行的时候:
查询一:(1,123 总计, 查询花费 10.0003 秒)
查询二:(1,123 总计, 查询花费 0.0010 秒)

以后多次运行,结果都如下:
查询一:(1,123 总计, 查询花费 0.0004 秒)
查询二:(1,123 总计, 查询花费 0.0010 秒)

很明显,第一次运行时的查询一超慢,以后的每次运行都比查询二快。

结论一:查询一在第一次运行时恰巧遇到机器的其他任务处理,影响了mysql速度;
结论二:查询一在第一次运行时本来就慢,以后变快是因为mysql或phpmyadmin对于相同的查询直接从缓存中读出?

那种结论理解的正确呢?请指点。

论坛徽章:
0
6 [报告]
发表于 2008-08-19 11:40 |只看该作者
顺便问一个更弱的问题,给分系统从哪里进入?满页链接和按钮,我楞是没找到……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP