1

以下の2つのテーブルがあります。

請求書

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の合計請求額も含むクエリを作成するにはどうすればよいですか。

ジョンの合計請求額= 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 です。重複する詳細を削除し、1 回だけカウントするようになりました。

アクセスのために編集:

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') then 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 aa.InvID による .InvID グループ) c.name による c グループとして

于 2012-09-03T09:07:02.967 に答える