来自两个联接表的SQL条件和
我有两个表格如下: 发票 细部 我希望得到以下输出,但我的查询将只提供John的白银和黄金总数。我如何构建一个查询,该查询还将包括John的发票总额 约翰的发票总金额=70 银总重量=7 黄金总重量=5 试试这个: 对于Sql Server:来自两个联接表的SQL条件和,sql,sql-server,ms-access,Sql,Sql Server,Ms Access,我有两个表格如下: 发票 细部 我希望得到以下输出,但我的查询将只提供John的白银和黄金总数。我如何构建一个查询,该查询还将包括John的发票总额 约翰的发票总金额=70 银总重量=7 黄金总重量=5 试试这个: 对于Sql Server: SELECT SUM(TotalAmount) AS TotalAmount, SUM(TotGold) AS TotGold, SUM(TotSilver) AS TotSilver FROM( SELECT SUM (I.Amount) OVER (
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
这是一个-现在它杀死重复的细节,并只计算一次
编辑以供访问:
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
试试这个:
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
我还没有尝试过其他已经发布的查询,它们可能已经适合您的需求,但以下是我的看法:-
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
选择名称,sumAmount为“总发票”,sumGold为“黄金”,sumSilver为Silver from 选择aa.名称,aa.金额, sumcase当bb.MetalType='Gold'然后bb.Weight else 0结束为'Gold', 当bb.MetalType='Silver'然后bb.Weight else 0结束为'Silver'时的sumcase
从aa左外侧加入aa上的bb.InvID=bb.InvID group by aa.InvID as c group by c.name@JohnWoo:因为有两个不同的人:John和Mike,第一个详细的条目是2的一部分。这不是给约翰的,而是给迈克的。所以John只有5金和3+4银,Mike只有2金。您的解决方案与MS SQL Server配合使用,但我使用的是MS Access。是否有其他方法可以构建查询而不使用D.Invid的过分区。谢谢。很抱歉,您为您的问题定义了SQL Server。我将其更新为AccessThank you先生,您必须是SQL专家,如果我想要所有发票的总金额、黄金总重量和白银总重量如何。如果您的意思是,对于所有客户,而不仅仅是John,那么下面是一个示例:
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
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
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