2016-01-04 101 views
0

我有一个用作报表基础的SQL查询。报告显示按年份,月份和燃料类型分组的燃料使用量。我想计算每种燃料类型的总量百分比,但我没有太多的运气。为了计算整体的百分比,我需要能够获得所使用燃料的总量,而不管它在哪个组中,我似乎无法弄清楚如何做到这一点。这是我的查询:SQL按组计算百分比

SELECT Year([DT1].[TransactionDate]) AS [Year], Month([DT1].[TransactionDate]) AS [Month], DT1.FuelType, Format(Sum(DT1.Used),"#.0") AS [Total Used],  
FROM (SELECT TransactionDate, FuelType, Round([MeterAfter]-[MeterBefore],2) AS Used FROM FuelLog) AS DT1 
WHERE (((DT1.TransactionDate) Between [Start Date] And [End Date])) 
GROUP BY Year([DT1].[TransactionDate]), Month([DT1].[TransactionDate]), DT1.FuelType 
ORDER BY Year([DT1].[TransactionDate]), Month(DT1.TransactionDate), DT1.FuelType; 

我试着添加以下作为子查询,但我得到一个错误,说子查询返回多个结果。

(SELECT Sum(Round([MeterAfter]-[MeterBefore],2)) AS Test 
FROM Fuellog 
WHERE Year([Year]) and Month([Month]) 
GROUP BY Year([TransactionDate]), Month([TransactionDate])) 

一旦我得到所有燃料的总和,我需要将燃料用量除以两种燃料的总量。我应该以不同的方式接近这个吗?

回答

2

试试这个

SELECT A.[Year] 
     ,A.[Month] 
     ,A.[FuelType] 
     ,A.[Total Used] 
     ,(A.[Total Used]/B.[Total By Year Month]) * 100 AS Percentage 
    FROM 
(
    SELECT Year([DT1].[TransactionDate]) AS [Year] 
    , Month([DT1].[TransactionDate]) AS [Month] 
    , DT1.FuelType 
    , Format(Sum(DT1.Used),"#.0") AS [Total Used] 
    FROM (
     SELECT TransactionDate 
       , FuelType 
       , Round([MeterAfter]-[MeterBefore],2) AS Used 
      FROM FuelLog 
     ) AS DT1 
WHERE (((DT1.TransactionDate) Between [Start Date] And [End Date])) 
GROUP BY Year([DT1].[TransactionDate]), Month([DT1].[TransactionDate]),  DT1.FuelType 
ORDER BY Year([DT1].[TransactionDate]), Month(DT1.TransactionDate),  DT1.FuelType 
) A 
INNER JOIN 
    (
    SELECT Sum(Round([MeterAfter]-[MeterBefore],2)) AS [Total By Year Month] 
     , Year([TransactionDate]) AS [Year] 
     , Month([TransactionDate])) AS [Month] 
     FROM Fuellog 
    GROUP 
     BY Year([TransactionDate]) 
     , Month([TransactionDate])) 
) B 
    ON A.[Year] = B.[Year] 
    AND A.[Month] = B.[Month] 
+0

完美的感谢@vmachan!在ORDER BY的一个上有一个半角字符,但是当我删除它时,查询完美地运行了!感谢您的帮助。 – mack

+0

@mack,很高兴帮助。我通过删除错误的分号更新了答案。 – vmachan

2

你需要加入到总计 - 是这样的(未经测试可能有错别字)

SELECT 
    Year([DT1].[TransactionDate]) AS [Year], 
    Month([DT1].[TransactionDate]) AS [Month], 
    DT1.FuelType, 
    Format(Sum(DT1.Used),"#.0") AS [Total Used],  
    (Sum(DT1.Used)/FT.Total) * 100 AS Percent 
FROM (
    SELECT 
    TransactionDate, 
    FuelType, 
    Round([MeterAfter]-[MeterBefore],2) AS Used 
    FROM FuelLog 
) AS DT1 
JOIN (
    SELECT 
    Sum(Round([MeterAfter]-[MeterBefore],2)) AS Total 
    FuelType 
    FROM Fuellog 
    WHERE TransactionDate Between [Start Date] And [End Date] 
    GROUP BY FuelType 
) FT ON DT1.FuelType = FT.FeulType 
WHERE DT1.TransactionDate Between [Start Date] And [End Date] 
GROUP BY Year([DT1].[TransactionDate]), Month([DT1].[TransactionDate]), DT1.FuelType, FT.Total 
ORDER BY Year([DT1].[TransactionDate]), Month(DT1.TransactionDate), DT1.FuelType, FT.Total;