1

我有两个表如下:

发票

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

4 回答 4

1

试试这个:

对于 Sql 服务器:

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 - 现在它会杀死重复的细节并只计算一次。

编辑访问:

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
于 2012-09-03T05:39:57.787 回答
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小提琴

于 2012-09-03T06:30:46.833 回答
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
于 2012-09-03T06:34:49.310 回答
0

select name, sum(Amount) as 'total invoice', sum(Gold) as 'Gold', sum(Silver) as Silver from( select aa.Name,aa.Amount, sum(case when bb.MetalType='Gold'然后 bb.Weight else 0 end) as 'Gold', sum(case when bb.MetalType='Silver' then bb.Weight else 0 end) as 'Silver' from a aa left outer join b bb on aa.InvID=bb .InvID group by aa.InvID) as c group by c.name

于 2012-09-03T09:07:02.967 回答