Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 子查询中的计数(*)_Sql Server_Subquery - Fatal编程技术网

Sql server 子查询中的计数(*)

Sql server 子查询中的计数(*),sql-server,subquery,Sql Server,Subquery,我需要每个订单的行项目数 在本例中,订单10有0行,订单11有2行 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.OrderDetail') AND type in (N'U')) DROP TABLE OrderDetail IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.OrderHeader') A

我需要每个订单的行项目数

在本例中,订单10有0行,订单11有2行

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.OrderDetail') AND type in (N'U'))
DROP TABLE OrderDetail
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.OrderHeader') AND type in (N'U'))
DROP Table OrderHeader
GO
CREATE TABLE OrderHeader(
OrderHeaderID Int Primary Key Identity(10,1),
CustID Int)
GO
CREATE TABLE OrderDetail(
OrderDetailID Int Primary Key Identity(100,1),
OrderHeaderID Int REFERENCES OrderHeader,
ItemID Int)
GO
DECLARE @OrderHeaderID Int
INSERT INTO OrderHeader(CustID) VALUES(1000)
INSERT INTO OrderHeader(CustID) VALUES(1001)
SET @OrderHeaderID=SCOPE_IDENTITY()
INSERT INTO OrderDetail(OrderHeaderID,ItemID) VALUES(@OrderHeaderID,3)
INSERT INTO OrderDetail(OrderHeaderID,ItemID) VALUES(@OrderHeaderID,4)
GO
SELECT 
OrderDetailID,ItemID,OrderHeader.OrderHeaderID,CustID
FROM OrderDetail
JOIN OrderHeader
ON OrderDetail.OrderHeaderID=OrderHeader.OrderHeaderID
-- 
这就是我需要帮助的地方 我需要计数(*)

像这样

SELECT 
  h.OrderHeaderID,
  h.CustID,
  COUNT(d.OrderHeaderID) CountOfOrderDetail
FROM 
  OrderHeader h
  LEFT JOIN OrderDetail d ON d.OrderHeaderID = h.OrderHeaderID
GROUP BY
  h.OrderHeaderID,
  h.CustID
像这样

SELECT 
  h.OrderHeaderID,
  h.CustID,
  COUNT(d.OrderHeaderID) CountOfOrderDetail
FROM 
  OrderHeader h
  LEFT JOIN OrderDetail d ON d.OrderHeaderID = h.OrderHeaderID
GROUP BY
  h.OrderHeaderID,
  h.CustID

为便于将来参考,请避免使用以下选项:

SELECT COUNT(*)
FROM OrderDetail
GROUP BY OrderHeaderID
乍一看,它似乎足够简单和优雅,但请注意,您将错过OrderHeader表中没有订单的任何订单。如果代表他们(计数为0)很重要,请参阅或的答案和


感谢您指出这一点!(请参阅下面的注释)

为了便于将来参考,您需要避免使用以下内容:

SELECT COUNT(*)
FROM OrderDetail
GROUP BY OrderHeaderID
乍一看,它似乎足够简单和优雅,但请注意,您将错过OrderHeader表中没有订单的任何订单。如果代表他们(计数为0)很重要,请参阅或的答案和


感谢您指出这一点!(请参见下面的评论)

您可能无法得到这个问题的答案。目前还不清楚当前的行为是什么或问题是什么。你可能无法得到这个问题的答案。现在还不清楚当前的行为是什么,或者问题是什么。你会错过没有订单的订单details@KM嗯,说得好!独裁似乎通过合并这两个表并使用标题表作为主要表来打击它,Tomalak更进一步,你会错过没有标题的订单details@KM嗯,说得好!独裁似乎通过合并这两个表并使用标题表作为主要表来打击它,Tomalak更进一步。谢谢!左外连接而不是内连接,但它对我有效。谢谢!左外连接而不是内连接,但它对我有效。
select 
   ord.OrderHeaderID
   , count(det.ItemID)
from
   OrderHeader ord
left outer join
   OrderDetail det
on
   det.OrderHeaderID = ord.OrderHeaderID
group by
   ord.OrderHeaderID