SQL COUNT 个在不同的表中

SQL COUNT in different tables

对于我要总结的每个供应商 -供应商销售的产品数量 - 订单数量 (PurchaseOrderID) -订单价值(小计)

这是我的数据库的样子

这就是我现在所在的位置

USE AdventureWorks2014
GO 
SELECT pv.Name, 
Continent = CASE pc.Name
WHEN 'United States' THEN 'Nordamerika'
WHEN 'England' THEN 'Europa'
WHEN 'Germany' THEN 'Europa'
WHEN 'France' THEN 'Europa'
END,
(SELECT COUNT(ProductID) FROM Purchasing.ProductVendor) NumberOfProducts,
(SELECT COUNT(PurchaseOrderID) FROM Purchasing.PurchaseOrderHeader) NumberOfOrders 
FROM Purchasing.Vendor pv
INNER JOIN Person.BusinessEntity pbe ON pv.BusinessEntityID = pbe.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress pbea ON pbe.BusinessEntityID = pbea.BusinessEntityID
INNER JOIN Person.Address pa ON pbea.AddressID = pa.AddressID
INNER JOIN Person.StateProvince psp ON pa.StateProvinceID = psp.StateProvinceID
INNER JOIN Person.CountryRegion pc ON psp.CountryRegionCode = pc.CountryRegionCode  
INNER JOIN Purchasing.ProductVendor ppv ON pv.BusinessEntityID = ppv.BusinessEntityID
INNER JOIN Purchasing.PurchaseOrderHeader ppoh ON pv.BusinessEntityID = ppoh.VendorID 
GROUP BY pv.Name, pc.Name

结果不是我想要的。我希望对每个供应商进行计数。

谢谢

我认为部分问题是 1:M 关系导致人为夸大计数。要解决这个问题,您可以使用派生表或分析函数。 使用派生表:

SELECT pv.Name, 
Continent = CASE pc.Name
WHEN 'United States' THEN 'Nordamerika'
WHEN 'England' THEN 'Europa'
WHEN 'Germany' THEN 'Europa'
WHEN 'France' THEN 'Europa'
END,
CntProd NumberOfProducts,
cntPO NumberOfOrders 
FROM Purchasing.Vendor pv
INNER JOIN Person.BusinessEntity pbe ON pv.BusinessEntityID = pbe.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress pbea ON pbe.BusinessEntityID = pbea.BusinessEntityID
INNER JOIN Person.Address pa ON pbea.AddressID = pa.AddressID
INNER JOIN Person.StateProvince psp ON pa.StateProvinceID = psp.StateProvinceID
INNER JOIN Person.CountryRegion pc ON psp.CountryRegionCode = pc.CountryRegionCode  
INNER JOIN (SELECT count(ProductID) CntProd, BusinessEntityID 
            FROM Purchasing.ProductVendor 
            GROUP BY BusinessEntityID) ppv ON pv.BusinessEntityID = ppv.BusinessEntityID
INNER JOIN (SELECT count(PurcahseOrderID) CntPO, VendorID
            FROM Purchasing.PurchaseOrderHeader 
            GROUP BY VendorID) ppoh ON pv.BusinessEntityID = ppoh.VendorID 

使用 window 函数(虽然我不确定这里的结果)给出了大陆与供应商名称和供应商区域与大陆的分组的案例陈述。可能需要将分组调整为:

GROUP BY pv.Name, CASE pc.Name
                  WHEN 'United States' THEN 'Nordamerika'
                  WHEN 'England' THEN 'Europa'
                  WHEN 'Germany' THEN 'Europa'
                  WHEN 'France' THEN 'Europa'
                  END

.

SELECT pv.Name, 
Continent = CASE pc.Name
WHEN 'United States' THEN 'Nordamerika'
WHEN 'England' THEN 'Europa'
WHEN 'Germany' THEN 'Europa'
WHEN 'France' THEN 'Europa'
END,
COUNT(ProductID) over (partition by PPV.BusinessEntityID) NumberOfProducts,
COUNT(PurchaseOrderID) over (partition by ppoh.VendorID) NumberOfOrders 
FROM Purchasing.Vendor pv
INNER JOIN Person.BusinessEntity pbe ON pv.BusinessEntityID = pbe.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress pbea ON pbe.BusinessEntityID = pbea.BusinessEntityID
INNER JOIN Person.Address pa ON pbea.AddressID = pa.AddressID
INNER JOIN Person.StateProvince psp ON pa.StateProvinceID = psp.StateProvinceID
INNER JOIN Person.CountryRegion pc ON psp.CountryRegionCode = pc.CountryRegionCode  
INNER JOIN Purchasing.ProductVendor ppv ON pv.BusinessEntityID = ppv.BusinessEntityID
INNER JOIN Purchasing.PurchaseOrderHeader ppoh ON pv.BusinessEntityID = ppoh.VendorID 
GROUP BY pv.Name, pc.Name