如何在group by中对子查询的结果求和

时间:2019-09-05 03:19:12

标签: sql sql-server group-by

我有一个查询,可以查询所需的详细数据。

现在,我需要更改结果以通过dbo.Contract.Descriptiondbo.PMTask.Description生成单个总计,而不是构成总计的单个条目。

这就是我的作品:

SELECT        dbo.Contract.Description, dbo.PMTask.Description, 
                         CAST(dbo.PMTimeActivity.TimeBillable AS decimal(10, 2)) / 60 *
                             (SELECT        SalesPrice
                               FROM            dbo.ARSalesPrice AS ARSalesPrice_1
                               WHERE        (InventoryID = dbo.InventoryItem.InventoryID) AND (dbo.PMTimeActivity.Date >= EffectiveDate) AND (dbo.PMTimeActivity.Date <= ExpirationDate) AND (dbo.InventoryItem.CompanyID = CompanyID)) AS Amount
FROM  dbo.InventoryItem
RIGHT OUTER JOIN dbo.PMTask
INNER JOIN dbo.Contract ON dbo.PMTask.CompanyID = dbo.Contract.CompanyID AND dbo.PMTask.ProjectID = dbo.Contract.ContractID
INNER JOIN dbo.PMTimeActivity ON dbo.PMTask.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.PMTask.ProjectID = dbo.PMTimeActivity.ProjectID AND dbo.PMTask.TaskID = dbo.PMTimeActivity.ProjectTaskID
ON dbo.InventoryItem.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.InventoryItem.InventoryID = dbo.PMTimeActivity.LabourItemID
WHERE (dbo.PMTimeActivity.IsCorrected = 0) AND (dbo.PMTimeActivity.IsBillable = 1) AND (dbo.PMTimeActivity.Billed = 0) AND (dbo.PMTimeActivity.DeletedDatabaseRecord <> 1)

如何更改查询,以便在添加以下Group By时达到我想要的?

Group By dbo.Contract.Description, dbo.PMTask.Description

最欢迎您提出任何建议。

2 个答案:

答案 0 :(得分:1)

更正查询以使其能够正常工作(缺少连接表)后,只需添加一个外部查询即可,该查询将指定的数量和组进行求和,例如

select ContractDescription, TaskDescription, sum(Amount)
from (
  SELECT dbo.[Contract].[Description] ContractDescription, dbo.PMTask.[Description] TaskDescription
    , CAST(dbo.PMTimeActivity.TimeBillable AS decimal(10, 2)) / 60 * (
      SELECT SalesPrice
      FROM dbo.ARSalesPrice AS ARSalesPrice_1
      WHERE (InventoryID = dbo.InventoryItem.InventoryID) AND (dbo.PMTimeActivity.[Date] >= EffectiveDate) AND (dbo.PMTimeActivity.[Date] <= ExpirationDate) AND (dbo.InventoryItem.CompanyID = CompanyID
    )) AS Amount
  FROM dbo.InventoryItem
  RIGHT OUTER JOIN dbo.PMTask
  INNER JOIN dbo.[Contract] ON dbo.PMTask.CompanyID = dbo.[Contract].CompanyID AND dbo.PMTask.ProjectID = dbo.[Contract].ContractID
  INNER JOIN dbo.PMTimeActivity ON dbo.PMTask.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.PMTask.ProjectID = dbo.PMTimeActivity.ProjectID AND dbo.PMTask.TaskID = dbo.PMTimeActivity.ProjectTaskID
  /* What should go here */  ON dbo.InventoryItem.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.InventoryItem.InventoryID = dbo.PMTimeActivity.LabourItemID
  WHERE (dbo.PMTimeActivity.IsCorrected = 0) AND (dbo.PMTimeActivity.IsBillable = 1) AND (dbo.PMTimeActivity.Billed = 0) AND (dbo.PMTimeActivity.DeletedDatabaseRecord <> 1)
) X
group by ContractDescription, TaskDescription;

答案 1 :(得分:0)

具有空集的分组集将为您的分组提供总计,您可以使用多维数据集,但是也会为每个分组列生成子总计。

SELECT        dbo.Contract.Description, dbo.PMTask.Description, 
                         CAST(dbo.PMTimeActivity.TimeBillable AS decimal(10, 2)) / 60 *
                             (SELECT        SalesPrice
                               FROM            dbo.ARSalesPrice AS ARSalesPrice_1
                               WHERE        (InventoryID = dbo.InventoryItem.InventoryID) AND (dbo.PMTimeActivity.Date >= EffectiveDate) AND (dbo.PMTimeActivity.Date <= ExpirationDate) AND (dbo.InventoryItem.CompanyID = CompanyID)) AS Amount
FROM            dbo.InventoryItem RIGHT OUTER JOIN
                         dbo.PMTask INNER JOIN
                         dbo.Contract ON dbo.PMTask.CompanyID = dbo.Contract.CompanyID AND dbo.PMTask.ProjectID = dbo.Contract.ContractID INNER JOIN
                         dbo.PMTimeActivity ON dbo.PMTask.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.PMTask.ProjectID = dbo.PMTimeActivity.ProjectID AND dbo.PMTask.TaskID = dbo.PMTimeActivity.ProjectTaskID ON 
                         dbo.InventoryItem.CompanyID = dbo.PMTimeActivity.CompanyID AND dbo.InventoryItem.InventoryID = dbo.PMTimeActivity.LabourItemID
WHERE        (dbo.PMTimeActivity.IsCorrected = 0) AND (dbo.PMTimeActivity.IsBillable = 1) AND (dbo.PMTimeActivity.Billed = 0) AND (dbo.PMTimeActivity.DeletedDatabaseRecord <> 1)
Group By Grouping Sets (dbo.Contract.Description, dbo.PMTask.Description, ())