CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请教一个统计查询语句,在线等,谢谢了

楼主songhp(宋海鹏)2004-12-03 04:25:23 在 MS-SQL Server / 基础类 提问

表A中记录的是所有产品信息,表B中记录的是所有产品的销售记录,具体结构如下:  
   
  表A   -   Dim_Product  
  ProductID  
  ProductName  
   
  表B   -   ProductSale  
  SaleID  
  ProductID  
  SaleValue   表示销售金额  
  SaleStatus   表示销售是否有效  
   
  例如现在表中数据为  
  Dim_Product  
  ProductID           ProductName  
  1                           打印机  
  2                           扫描仪  
   
  ProductSale  
  SaleID                 ProductID                 SaleValue         SaleStatus  
  1                           1                                 100                     1  
  2                           1                                 200                     0  
   
  我想要做一个统计,统计所有产品销售有效记录金额总计(包含所有产品,如果没有销售则显示为0),现在我的写法是  
  SELECT   dbo.Dim_Product.ProductName,   COUNT(dbo.ProductSale.SaleQty)   AS   ClaimValue  
  FROM   dbo.Dim_Product   LEFT   OUTER   JOIN  
              dbo.ProductSale   ON   dbo.Dim_Product.ProductID   =   dbo.ProductSale.ProductID  
  WHERE   (dbo.ProductSale.SaleStatus   =   1)  
  GROUP   BY   dbo.Dim_Product.ProductName  
  但是这样我选择出来的结果如下:  
  ProductName       ClaimValue  
  打印机                 100  
  而我希望得到的结果如下:  
  ProductName       ClaimValue  
  打印机                 100  
  扫描仪                 0  
   
  请问需要如何修改?  
  问题点数:20、回复次数:8Top

1 楼songhp(宋海鹏)回复于 2004-12-03 04:49:01 得分 0

试验出来了。下面这样可以,但是效率好像并不是很好,请问有没有其他方法呢?  
  SELECT   A.PRODUCTID   ,   COUNT(B.SALEID)  
  FROM   DIM_PRODUCT   A   LEFT   OUTER   JOIN    
  (SELECT   SALEID   ,   PRODUCTID   ,   SALEQTY   FROM   PRODUCTSALE   WHERE   SALESTATUS   =   1)   B    
  ON   A.ProductID   =   B.ProductID  
  GROUP   BY   A.PRODUCTIDTop

2 楼double22822(大无忧-老实和尚(有事发消息))回复于 2004-12-03 08:22:10 得分 0

select   a.productid,a.productname,sum(b.SaleValue)   where   a.productid   *=   b.productid   group   by   a.productid,a.productname  
  你测试一下.Top

3 楼double22822(大无忧-老实和尚(有事发消息))回复于 2004-12-03 08:23:08 得分 0

select   a.productid,a.productname,sum(b.SaleValue)   where   a.productid   *=   b.productid   and   b.salestatue   =   1    
  group   by   a.productid,a.productname  
  Top

4 楼lmj2003(雁不归)回复于 2004-12-03 09:03:59 得分 10

CREATE   TABLE   #Dim_Product  
  (ProductID   VARCHAR(10),  
  ProductName   VARCHAR(20)  
  )  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('1'   ,'打印机')  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('2'   ,'扫描仪')  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('1'   ,'打印机')  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('3'   ,'电脑')  
   
   
  DROP   TABLE   #ProductSale  
  CREATE   TABLE   #ProductSale  
  (  
    SaleID   VARCHAR(10),                  
    ProductID   VARCHAR(10),              
    SaleValue     INT,        
  SaleStatus   VARCHAR(10)  
  )  
   
   
  INSERT   INTO   #ProductSale(SaleID,ProductID,SaleValue,SaleStatus)  
  VALUES   ('1'   ,'1',100,'1')  
   
  INSERT   INTO   #ProductSale(SaleID,ProductID,SaleValue,SaleStatus)  
  VALUES   ('1'   ,'1',300,'1')  
   
  INSERT   INTO   #ProductSale(SaleID,ProductID,SaleValue,SaleStatus)  
  VALUES   ('2'   ,'1',200,'0')  
  --测试  
  SELECT   a.ProductID,a.ProductName,sum(case   b.SaleStatus   when   '1'   then   b.SaleValue   else   0   end)as   SaleValue  
  FROM   #Dim_Product   a,#ProductSale   b  
  where   a.ProductID*=b.ProductID  
  group   by   a.ProductID,a.ProductName  
   
   
  --测试结果  
  ProductID     ProductName                     SaleValue        
  ----------   --------------------   -----------    
  1                     打印机                                     400  
  3                     电脑                                       0  
  2                     扫描仪                                     0  
   
  (所影响的行数为   3   行)Top

5 楼lmj2003(雁不归)回复于 2004-12-03 09:06:56 得分 0

INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('1'   ,'打印机')  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('2'   ,'扫描仪')  
   
  --INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  --VALUES   ('1'   ,'打印机')  
   
  INSERT   INTO   #Dim_Product(ProductID,ProductName)  
  VALUES   ('3'   ,'电脑')  
   
  --DROP   TABLE   #ProductSale  
  修改一下  
  Top

6 楼513cat(513cat)回复于 2004-12-03 09:46:21 得分 10

以下为个人意见,仅供参考,如有理解不正确之处请指正:  
  回复:楼主  
          你所感觉效率问题,我想出现在子查询上,可以使用“lmj2003(雁不归)   ”的临时表的办法应该可以解决。还有对主键如做索引填充应该也有提升,尤其是在海量数据下更为明显。  
  回复:   double22822(大无忧-老实和尚(有事发消息))    
          你所采用的*=操作,与楼主所用的Left   Join相似只不过Left   Join   是MS-SQL所特有的,你所用的是SQL-92标准,可以便于迁移,如果Microsoft对Left   Join做过优化,那么使用Left   Join   应该比*=操作效率高点。  
  回复:lmj2003(雁不归)    
          我想我与你的想法一样,采用临时表,加快速度,只要再修改一下将SalesID修改为整型,我想可以有效率改变。Top

7 楼guanjueweimiao(感觉微妙)回复于 2004-12-03 10:23:34 得分 0

select   ProductName,sum(case   SaleStatus   when   1   then   SaleValue   else   0   end   )as   SaleValue  
  from   Dim_Product   d   left   join   ProductSale   p   on   d.ProductID=p.ProductID  
  group   by     ProductNameTop

8 楼songhp(宋海鹏)回复于 2004-12-03 17:41:10 得分 0

谢谢lmj2003(雁不归)   和513cat(513cat)Top

相关问题

  • 一个统计查询语句如何写,在线等
  • 请教查询统计的SQL语句???
  • 求统计月份的查询语句
  • 求一查询统计的SQl语句
  • 求个查询统计的语句
  • 请问,按月统计的SQL查询语句怎么写~~~~~~~~~~在线送分
  • 50分请教一个统计查询的sql语句
  • 查询语句
  • 查询语句
  • 查询语句

关键词

  • 修改
  • 销售
  • productsale
  • salestatus
  • productid
  • salevalue
  • productname
  • saleid
  • 打印机
  • dbo

得分解答快速导航

  • 帖主:songhp
  • lmj2003
  • 513cat

相关链接

  • SQL Server类图书

广告也精彩

反馈

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