来自两个连接表的SQL条件总和

时间:2012-09-03 05:36:07

标签: sql sql-server ms-access

我有两张表格如下:

发票

InvId | Amount  | Name
-----------------------
1     | 50      | John
2     | 30      | Mike
3     | 20      | John

详细

MetalType| Weight | InvId
-------------------------
Gold     | 2      | 2
Silver   | 4      | 3
Silver   | 3      | 3
Gold     | 5      | 1

我想得到以下输出,但我的查询只会为John提供银和金的总和。如何构建一个查询,其中还包括John的总发票金额。

John的总发票金额= 70
总银重= 7
总黄金韦斯= 5

SELECT
SUM(IFF(D.MetalType=”Gold”, D.Weight, 0)) AS TotGold,
SUM((IFF(D.MetalType=”Silver”, D.Weight, 0)) AS TotSilver
FROM Invoice I INNER JOIN Detail D ON I.InvId = D.InvId WHERE I.Name = “John”   

4 个答案:

答案 0 :(得分:1)

试试这个:

对于Sql-Server:

SELECT 
SUM(TotalAmount) AS TotalAmount,
SUM(TotGold) AS TotGold,
SUM(TotSilver) AS TotSilver
FROM(
SELECT
SUM (I.Amount) OVER (Partition by D.Invid) AS TotalAmount,
SUM(CASE WHEN D.MetalType='Gold' THEN D.Weight ELSE 0 END) AS TotGold,
SUM(CASE WHEN D.MetalType='Silver' THEN D.Weight ELSE 0 END) AS TotSilver
FROM Invoice I INNER JOIN Detail D ON I.InvId = D.InvId

WHERE I.Name = 'John'
GROUP BY D.InvId, I.Amount) n

这是一个SQL Fiddle - 现在它会杀死重复的细节,只计算一次。

EDITED for Access:

SELECT
  n.Name,
  MAX(TotalAmount),
  SUM(TotGold) AS TotGold,
  SUM(TotSilver) AS TotSilver
FROM(
  SELECT
   I.Name,
   SUM(CASE WHEN D.MetalType='Gold' THEN D.Weight ELSE 0 END) AS TotGold,
   SUM(CASE WHEN D.MetalType='Silver' THEN D.Weight ELSE 0 END) AS TotSilver
  FROM Invoice I 
  INNER JOIN Detail D ON I.InvId = D.InvId
  GROUP BY I.Name, D.InvId, I.Amount) n
INNER JOIN (
   SELECT
     I.Name, SUM (I.Amount) AS TotalAmount
    FROM Invoice I
    GROUP BY I.Name) m ON m.Name = n.Name
GROUP BY n.Name

答案 1 :(得分:1)

试试这个:

With tbl3 (Amt,Gold,Silver)
as
(
    SELECT
    SUM (I.Amount) OVER (Partition by D.Invid) AS TotalAmount,
    SUM(CASE WHEN D.MetalType='Gold' THEN D.Weight ELSE 0 END) AS TotGold,
    SUM(CASE WHEN D.MetalType='Silver' THEN D.Weight ELSE 0 END) AS TotSilver
    FROM Invoice I Right JOIN Detail D ON I.InvId = D.InvId 
    WHERE I.Name = 'John' Group by D.InvId, I.Amount
)
Select SUM(Amt) as Total_Invoice_Amount_For_John,
SUM(Gold) as Total_Silver_Weight,
SUM(Silver) as Total_Gold_Width from tbl3

<强> SQL Fiddle

答案 2 :(得分:0)

我还没有尝试过已发布的其他查询,但它们可能已经适合您想要的内容了,但这是我对它的看法: -

SELECT X.NAME, X.METALTYPE, X.WEIGHT, Y.TOTAL
FROM
    (SELECT NAME, METALTYPE, SUM(Weight) AS WEIGHT
    FROM INVOICE i
    INNER JOIN DETAIL d ON i.InvId = d.InvId
    GROUP BY NAME, METALTYPE) X
INNER JOIN
    (SELECT SUM(AMOUNT) AS Total, NAME
    FROM INVOICE
    GROUP BY NAME)Y
    ON X.NAME = Y.NAME
ORDER BY NAME, TOTAL, METALTYPE

答案 3 :(得分:0)

选择姓名,金额(金额)作为'总发票',金额(金)为'金',金额(银)为银() 选择aa.Name,aa.Amount, sum(bb.MetalType ='Gold'然后bb.Weight else 0 end的情况)为'Gold', sum(bb.MetalType ='Silver'然后bb.Weight else 0 end的情况)为'Silver'  aa.InvID = bb.InvID group by aa.InvID)a a left outer join b bb in c group by c.name

相关问题