从范围中选择一个不同的总和

时间:2013-11-21 18:18:38

标签: sql sql-server tsql sum

我真的绞尽脑汁试图弄明白这一点。

给出以下样本数据:

CustomerNo      Product      Country      Month      Price     CostA    CostB
CUSTA           PRD          AU           1          100       200      300
CUSTB           PRD          AU           1          115       200      300
CUSTA           PRD          AU           2          120       250      350
CUSTB           PRD          AU           2          150       250      350
CUSTC           PRD          AU           3          125       300      400
CUSTD           PRD          AU           3          135       300      400

价格由客户存储,成本(CostA和CostB)按国家/地区存储。

我需要根据范围获得“不同”的成本总和。

例如,我需要获得第一季度(1月至2月)的成本总和。

CostA的正确金额为200 + 250 + 300,CostB为300 + 350 + 400

以下查询返回国家/地区的所有费用总和,例如200 + 250 + 300 * 2的费用A.

SELECT DISTINCT 
c.Country,
costAQ1.SumGross AS costAQ1
FROM Customers c 
INNER JOIN
(
SELECT Country,
SUM(CostA) AS SumGross
FROM Customers
WHERE [Month] BETWEEN 1 AND 3 
GROUP BY
Country
) AS costAQ1
ON p.Country = costAQ1.Country

知道我怎么能做到这一点吗?

由于

编辑:

这段代码似乎已经完成了

SELECT DISTINCT
        c.Country,
        CostA.SumGross as CostA,
        CostB.SumGross as CostB
FROM    Customers c
INNER JOIN
(
    SELECT  Country
        SUM(DISTINCT CostA) AS SumGross
    FROM    Customers
    WHERE   [Month] BETWEEN 1 AND 3
    GROUP BY 
        Country
) AS CostA
ON c.Country = CostA.Country
INNER JOIN
(
    SELECT  Country, 
        SUM(DISTINCT CostB) AS SumGross
    FROM    Customers
    WHERE   [Month] BETWEEN 1 AND 3
    GROUP BY 
        Country
) AS CostB
ON c.Country = CostB.Country

返回:

Country     CostA    CostB
AU          750      1050

2 个答案:

答案 0 :(得分:3)

我不确定你为什么会这样做,也许你在那里有重复的值,你试图忽略它们。试试这个:

SELECT Country, SUM(DISTINCT CostA) AS SumGross
FROM Customers
WHERE [Month] BETWEEN 1 AND 3 
GROUP BY Country

sqlfiddle demo

编辑:

您可以通过以下方式实现上次发布的查询:

SELECT Country,
  SUM(DISTINCT CostA) AS SumGrossA,
  SUM(DISTINCT CostB) AS SumGrossB
FROM Customers
WHERE [Month] BETWEEN 1 AND 3
GROUP BY Country

sqlfiddle demo

编辑:

要包含额外的宿舍,您可以这样做:

SELECT a.Country,
  a.SumGrossAQ1,
  a.SumGrossBQ1,
  b.SumGrossAQ2,
  b.SumGrossBQ2
FROM (
  SELECT Country,
    SUM(DISTINCT CostA) AS SumGrossAQ1,
    SUM(DISTINCT CostB) AS SumGrossBQ1
  FROM Customers
  WHERE [Month] BETWEEN 1 AND 3
  GROUP BY Country
  ) a
LEFT JOIN (
  SELECT Country,
    SUM(DISTINCT CostA) AS SumGrossAQ2,
    SUM(DISTINCT CostB) AS SumGrossBQ2
  FROM Customers
  WHERE [Month] BETWEEN 4 AND 6
  GROUP BY Country
  ) b ON a.country = b.country

sqlfiddle demo 在此示例中,您没有Q2的数据,但请在数据中尝试。

答案 1 :(得分:1)

SELECT Country, SUM(month_cost) AS SumGross
FROM (SELECT Country,Month, SUM(DISTINCT CostA) AS month_cost
      FROM Customers
      WHERE [Month] BETWEEN 1 AND 3 
      GROUP BY Country,Month) A
GROUP BY Country