当前位置: 代码迷 >> Sql Server >> mssql2008多表连接查询,如若排除重复, 只保留一条
  详细解决方案

mssql2008多表连接查询,如若排除重复, 只保留一条

热度:53   发布时间:2016-04-24 09:11:12.0
mssql2008多表连接查询,如果排除重复, 只保留一条
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