2014-10-29 63 views
1

我有一个查询哪些联盟的两个单独的查询具有相同的字段/数据类型。查询如下:是如何总结和分组通过联盟选择查询的结果

SELECT  BusinessUnitName, BuildingNumber, Description, Value_1, 
        LifeRemaining, Sum_Quant 
FROM   
(
SELECT  bu.BusinessUnitName, b.BuildingNumber, ec.Description, SUM(cc.MonetaryValue) AS Value_1, 
        cc.LifeRemaining, SUM(a.Quantity) AS Sum_Quant 
FROM   tbBuildingLinkBusinessUnit as blb INNER JOIN 
        tbBusinessUnit as bu ON blb.BusinessUnitID = bu.BusinessUnitID INNER JOIN 
        tbBuilding as b ON blb.BuildingID = b.BuildingID INNER JOIN 
        tbFloor ON b.BuildingID = tbFloor.BuildingID INNER JOIN 
        tbRoom as r ON tbFloor.FloorID = r.FloorID INNER JOIN 
        tbConditionComponent as cc INNER JOIN 
        tbAsset as a ON cc.ParentID = a.AssetUID INNER JOIN 
        tbElement as e ON cc.ElementID = e.ElementID AND a.ElementID = e.ElementID INNER JOIN 
        tbElementCategory as ec ON e.ElementCategoryID = ec.ElementCategoryID ON r.RoomID = a.LocationID 
WHERE  (cc.MonetaryValue > 0) 
GROUP BY bu.BusinessUnitName, b.BuildingNumber, ec.Description, a.Status, cc.LifeRemaining 
HAVING  (a.Status = 0) 

UNION 

SELECT  bu.BusinessUnitName, b.BuildingNumber, ec.Description, SUM(cc.MonetaryValue) AS Value_1, 
        cc.LifeRemaining, SUM(a.Quantity) AS Sum_Quant 
FROM   tbBuildingLinkBusinessUnit as blb INNER JOIN 
        tbBusinessUnit as bu ON blb.BusinessUnitID = bu.BusinessUnitID INNER JOIN 
        tbBuilding as b ON blb.BuildingID = b.BuildingID INNER JOIN 
        tbConditionComponent as cc INNER JOIN 
        tbAsset as a ON cc.ParentID = a.AssetUID INNER JOIN 
        tbElement as e ON cc.ElementID = e.ElementID AND a.ElementID = e.ElementID INNER JOIN 
        tbElementCategory as ec ON e.ElementCategoryID = ec.ElementCategoryID ON b.BuildingID = a.LocationID 
WHERE  (cc.MonetaryValue > 0) 
GROUP BY bu.BusinessUnitName, b.BuildingNumber, ec.Description, a.Status, cc.LifeRemaining 
HAVING  (a.Status = 0) 
) AS x 

ORDER BY BusinessUnitName, Description 

个体选择查询的结果与前两行从查询1来与第二两条线从查询2来如下:

TEST PROPERTY | 1/A |电气服务| 515.82 | 0 | 3

TEST PROPERTY | 1/A |电气服务| 125 | 1 | 2

TEST PROPERTY | 1/A |电气服务| 381.6 | 0 | 8

TEST PROPERTY | 1/A |电气服务| 80615.93 | 5 | 7

我的问题是我怎么现在合并这两个查询的结果,以便这两个查询的第一个结果执行一个SUM,因为它们都在列5中的值为0?这将导致3行结果与第1行和第3行相结合。

在此先感谢

回答

2

使用

  Derived GROUP BY your_value 

尝试像下面,

  SELECT  BusinessUnitName, BuildingNumber, Description, 
      LifeRemaining, SUM(Value_1) as Value, SUM(Sum_Quant) as Quant 
      FROM   
      (
      SELECT  bu.BusinessUnitName, b.BuildingNumber, ec.Description, SUM(cc.MonetaryValue)   AS Value_1, 
       cc.LifeRemaining, SUM(a.Quantity) AS Sum_Quant 
      FROM   tbBuildingLinkBusinessUnit as blb INNER JOIN 
       tbBusinessUnit as bu ON blb.BusinessUnitID = bu.BusinessUnitID INNER JOIN 
       tbBuilding as b ON blb.BuildingID = b.BuildingID INNER JOIN 
       tbFloor ON b.BuildingID = tbFloor.BuildingID INNER JOIN 
       tbRoom as r ON tbFloor.FloorID = r.FloorID INNER JOIN 
       tbConditionComponent as cc INNER JOIN 
       tbAsset as a ON cc.ParentID = a.AssetUID INNER JOIN 
       tbElement as e ON cc.ElementID = e.ElementID AND a.ElementID = e.ElementID INNER   JOIN 
       tbElementCategory as ec ON e.ElementCategoryID = ec.ElementCategoryID ON r.RoomID = a.LocationID 
       WHERE  (cc.MonetaryValue > 0) 
       GROUP BY bu.BusinessUnitName, b.BuildingNumber, ec.Description, a.Status,   cc.LifeRemaining 
       HAVING  (a.Status = 0) 

      UNION 

      SELECT  bu.BusinessUnitName, b.BuildingNumber, ec.Description, SUM(cc.MonetaryValue) AS Value_1, 
       cc.LifeRemaining, SUM(a.Quantity) AS Sum_Quant 
      FROM   tbBuildingLinkBusinessUnit as blb INNER JOIN 
       tbBusinessUnit as bu ON blb.BusinessUnitID = bu.BusinessUnitID INNER JOIN 
       tbBuilding as b ON blb.BuildingID = b.BuildingID INNER JOIN 
       tbConditionComponent as cc INNER JOIN 
       tbAsset as a ON cc.ParentID = a.AssetUID INNER JOIN 
       tbElement as e ON cc.ElementID = e.ElementID AND a.ElementID = e.ElementID INNER JOIN 
       tbElementCategory as ec ON e.ElementCategoryID = ec.ElementCategoryID ON  b.BuildingID = a.LocationID 
       WHERE  (cc.MonetaryValue > 0) 
       GROUP BY bu.BusinessUnitName, b.BuildingNumber, ec.Description, a.Status,   cc.LifeRemaining 
       HAVING  (a.Status = 0) 
       ) Derived GROUP BY BusinessUnitName, BuildingNumber, Description, 
      LifeRemaining     
       ORDER BY BusinessUnitName, Description 

仅供参考 https://social.msdn.microsoft.com/forums/sqlserver/en-US/cd32bf58-c581-404b-a384-e62cdda7a131/union-all-and-group-by-query

希望它可以帮助...

+0

谢谢,我现在试试 – 2014-10-29 12:16:40

+0

我收到以下错误: 消息8120,级别16,状态1,行1 列'Derived.BusinessUnitName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句。 如果我通过获得相同的结果包含派生组中的选择字段? – 2014-10-29 12:21:17

+0

在group by子句中包含BusinessUnitName列,它解决了问题 – SDK 2014-10-29 12:25:16