请教一个统计查询语句,在线等,谢谢了
表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




