Product(产品表)
productid varchar(40)
pname varchar(80)
.....
orderlist(订单表)
id varchar(40)
productid varchar(40)-- 产品ID
ptotal decimal --总价
createdate datetime
.....
产品表与订单表的关系是一对多。 一条产品记录有多条订单记录
SELECT dbo.product.productid ,
dbo.product.price ,
( SELECT COUNT(1)
FROM dbo.orderlist
WHERE ( dbo.product.productid = productid )
) AS Total ,
( SELECT SUM(ptotal)
FROM dbo.orderlist
WHERE ( dbo.product.productid = productid )
) AS AllPrice
FROM dbo.product
INNER JOIN dbo.orderlist AS orderlist_1 ON orderlist_1.productid = dbo.product.productid
WHERE orderlist_1.createtime BETWEEN DATEADD(d, -30, GETDATE()) AND GETDATE()
查询结果:

如何去除重复?
------解决思路----------------------
SELECT dbo.product.productid ,
dbo.product.price,
COUNT(1) AS Total,
SUM(orderlist_1.ptotal) AS AllPrice
FROM dbo.product
INNER JOIN dbo.orderlist AS orderlist_1
ON orderlist_1.productid = dbo.product.productid
WHERE orderlist_1.createtime BETWEEN DATEADD(d, -30, GETDATE()) AND GETDATE()
GROUP BY dbo.product.productid, dbo.product.price
------解决思路----------------------
视图中可以用GROUP BY 啊。
------解决思路----------------------
加条件又有什么关系?
按产品统计订单为什么不用GROUP BY?
------解决思路----------------------
SELECT dbo.product.productid ,
dbo.product.price ,
( SELECT COUNT(1)
FROM dbo.orderlist
WHERE ( dbo.product.productid = productid )
) AS Total ,
( SELECT SUM(ptotal)
FROM dbo.orderlist
WHERE ( dbo.product.productid = productid )
) AS AllPrice
FROM dbo.product
where productid in (select productid
from dbo.orderlist AS orderlist_1
WHERE orderlist_1.createtime BETWEEN DATEADD(d, -30, GETDATE()) AND GETDATE())
------解决思路----------------------
有简单的方法不用,非得用低效率的语句,不可理喻!
------解决思路----------------------
2005以后可以用WINDOW 函数就可以不用GROUP BY。
OVER Clause (Transact-SQL)
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg"
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count"
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min"
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max"
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO