CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

这句sql应该怎么写?

楼主demogorgon(demo)2001-10-24 08:21:30 在 MS-SQL Server / 基础类 提问

有一个销售记录的表   ,字段是这样的   id(销售记录id)     ,month(月份),week(周)  
    ,amount(销售数量),p_id(产品id号)  
         
            我想查某月某一周每种产品的数量(按p_id升序),要求是:如果该周没有某产品记录,也要显示为空   。如果这么写     select   amount   from   sale      
                                                                            where   month=1  
                                                                                        and   week=1  
                                                                            order   by   p_id  
    就不能满足要求了!请教的说!!! 问题点数:20、回复次数:17Top

1 楼ccat(智拙)回复于 2001-10-24 08:51:46 得分 0

select   nullif(amount,   0)   from   where   month=1   and   week=1  
  Top

2 楼wwl007(疑难杂症)回复于 2001-10-24 09:00:33 得分 0

你应该还有个商品种类维护表  
  假设为t1  
  那么可以这样。  
  select   isnull(amonut,0)   from   t1   left   join   sale   on   t1.p_id=sale.p_id   where   sale.month=1   and  
  week=1   order   by   p_idTop

3 楼demogorgon(demo)回复于 2001-10-24 09:47:17 得分 0

不行啊,报错:[Microsoft][ODBC   Microsoft   Access   Driver]   Wrong   number   of   arguments   used   with   function   in   query   expression   'isnull(amount,0)'  
   
  我把isnull删了就不报错了,但是结果还是不对,如何解决?可以解释一下isnull的意义么?  
  Top

4 楼demogorgon(demo)回复于 2001-10-24 10:23:42 得分 0

upTop

5 楼armadawang(wjq)回复于 2001-10-24 10:34:51 得分 0

好象要用产品的全关联:  
      Select   B.ID,S.Amonut  
          from   Sale   S,P   B  
        Where   S.ID   =*   B.ID  
        order   by   b.idTop

6 楼hellospring(田甜)回复于 2001-10-24 10:56:15 得分 0

    month=request("month")  
      week=request("week")  
    sqlcmd="Select   amount   from   sale   where   month='"&month&"'and   week='"&week&"'  
      con.excute(sqlcmd)  
  try   it   !Top

7 楼wwl007(疑难杂症)回复于 2001-10-24 11:14:39 得分 0

什么数据库阿我说的是sql   server!  
  如果是oracle用nvl,别的数据库就不知道了Top

8 楼sun_jb(小字符)回复于 2001-10-24 12:56:14 得分 0

这个问题我有点不明白,既然该周没有某产品记录,该表中就不会有该产品的p_id,单靠这一张表怎么能让这种没有记录的产品显示销售数量为null呢?  
  如果当月当周该产品没有销售同样作为一条null的记录输入sale表,那你的SQL的写法完全没问题.Top

9 楼lovewangj(lllll)回复于 2001-10-24 13:25:55 得分 0

是不是还应该有一个产品明细表i1,如果有并且产品ID是唯一的话,可以这样:  
  select   pid,amount   from   sale   where.....  
  union  
  select   i1.id,0   from   sale   from   i1   where   i1.id   not   in(select   pid   from   sale   where...)Top

10 楼GodHack(勇敢的心)回复于 2001-10-24 13:51:51 得分 0

如果按照SUN_JB的说法,则你可能假设如果你的记录有第一周和第二周但没有第三周,则你只有通过外链接才可以的  
  创建这样一个表专门记录月跟周数,(如MONTHWEEK表)字段为:MONTH,与WEEK   记录为1,11,2,1,3,1,4表示是一月的各周  
  select   sale.*  
  from   monthweek  
  left   join   sale   on   monthweek.month=sale.month   and   monthweek.week=sale.week  
  where   sale.month=month值   and   sale.week=Week值Top

11 楼GodHack(勇敢的心)回复于 2001-10-24 13:59:37 得分 20

但是如果你里面存在这条记录的话则你的就可以了如果没有存在的话,则必须要建立一条记录来关联,因为用SELECT列出的记录都是必须要建立在记录集的基础上如果没有的话,你SELECT语句再复杂也是白搭,另外,ISNULL是判断如果存在此条记录(行),且该列为空的时候可以用ISNULL来设定它的值为你想要的格式,如果根本没有此行,则肯定无效Top

12 楼demogorgon(demo)回复于 2001-10-24 14:53:03 得分 0

确实有产品的信息表Top

13 楼MountLion(闷头睡)回复于 2001-10-24 18:34:52 得分 0

GodHack所言甚是。  
  只需两个工作表,记录固定,一个存储1~12,另一个存储1~4,然后与销售表外连接就行了Top

14 楼carl416(小航)回复于 2001-10-24 21:43:57 得分 0

产品有无销售数量,前提是有该产品记录,数量应该是一个》=0的数值,  
  所以我认为:如果某一产品可能在某一周有销售记录,而在某一周有,  
  没有的应该设定其值为0,而不是让人难以理解的空!!   这样的话,用  
  很简单的语句就能得到很明确的结果,不需要多余的表单了!Top

15 楼spyer(鱼人)回复于 2001-10-24 21:57:39 得分 0

如果要保证所有产品都要有,则必须左连接:应该有一个产品表。  
  如果有,我们不妨假设为product,其中id为产品id字段。  
  select   product.id   as   p_id,  
     
  from   product   left   ouTop

16 楼bjay(ben)回复于 2001-10-24 22:09:31 得分 0

我同意GodHack(jason)的说法,  
  只有用一个产品销售流水表,一个表只有一年中的所有week,利用这两个表的外交叉,就可实现你要的功能。  
  另:SQL   Server中的IsNull与oracle中的nvl两函数功能一样,可以使NULL字段变为0。Top

17 楼spyer(鱼人)回复于 2001-10-24 22:14:37 得分 0

如果要保证所有产品都要有,则必须左连接:应该有一个产品表。  
  如果有,我们不妨假设为product,其中id为产品id字段。  
  select   product.id   as   p_id,  
                case   when   temp_a.amount   is   null   then   0   else   temp_a.amount   end   as   amount,  
                1     as   month,  
                1       as   week  
  from   product    
  left   outer   join    
      (select   p_id,  
                      sum(amount)   as   amount,  
                      month,  
                      week  
        from       sale  
        where     month=1   and  
                      week=1  
        group   by   p_id,month,week   )   as   temp_a  
  on   product.id=temp_a.p_id  
  order   by   product.id   asc;  
  或者假设没有产品表,则如下:  
  select   temp_a.p_id   as   p_id,  
                case   when   temp_b.amount   is   null   then   0   else   temp_b.amount   end   as   amount,  
                1   as   month,  
                2   as   week  
  from                
  (select   distinct   p_id   from   sale)   as   temp_a  
  left   outer   join  
  (select   p_id,sum(amount),month,week    
    from   sale  
    where   month=1   and  
                week=1  
    group   by   p_id,month,week)   as   temp_b  
  on   temp_a.p_id=temp_b.p_id  
  order   by   temp_a.p_id;  
   
  关于case   语句中判断某字段是否为NULL,不同DBMS提供的方法可能有差异,可对号入座。  
  我所列举的是IBM   DB2   的方法,SQL   SERVER   的我不太清楚。希望对你有用。Top

相关问题

  • 这个SQL语句应该怎么写?
  • 这句sql句子应该怎么写?
  • 这条sql语句应该怎么写?
  • 求助:着句SQL应该怎么写?
  • 这个SQL语言应该怎么写
  • 这句sql应该怎么写?
  • 这个SQL语句应该怎么写?
  • 这个sql语句应该怎么写??
  • 这条sql语句应该怎么写?
  • 这样的sql应该怎么写?

关键词

  • 销售
  • 记录
  • week
  • 产品
  • 表
  • sale
  • month
  • amount
  • isnull
  • 应该

得分解答快速导航

  • 帖主:demogorgon
  • GodHack

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo