Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自两个联接表的SQL条件和_Sql_Sql Server_Ms Access - Fatal编程技术网

来自两个联接表的SQL条件和

来自两个联接表的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 (

我有两个表格如下:

发票

细部

我希望得到以下输出,但我的查询将只提供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 (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