Tsql 基于发票项目返回发票(内部联接)
我在SQL Server中有两个表:Invoice和InvoiceItem。两个表都有一个InvoiceID列,InvoiceItem表有一个ItemID列 我需要的是一个查询,如果InvoiceItems具有指定的ItemID,我可以运行该查询返回发票 例如:Tsql 基于发票项目返回发票(内部联接),tsql,Tsql,我在SQL Server中有两个表:Invoice和InvoiceItem。两个表都有一个InvoiceID列,InvoiceItem表有一个ItemID列 我需要的是一个查询,如果InvoiceItems具有指定的ItemID,我可以运行该查询返回发票 例如: Invoice.InvoiceID = 1 InvoiceItem.InvoiceItemID = 1 InvoiceItem.InvoiceID = 1 InvoiceItem.ItemID = 1 InvoiceItem.Inv
Invoice.InvoiceID = 1
InvoiceItem.InvoiceItemID = 1
InvoiceItem.InvoiceID = 1
InvoiceItem.ItemID = 1
InvoiceItem.InvoiceItemID = 2
InvoiceItem.InvoiceID = 1
InvoiceItem.ItemID = 2
我需要查询正好有2行项目的任何发票,一个项目ID为1,一个项目ID为2
我认为一个带有“IN”语句的内部连接可能会让我达到目的,但它返回的不仅仅是一张发票。下面返回ItemID为1或2的任何发票。这有点像我想要一个“and”而不是“in”中的“or”
而不是在
我理解你的意思,但它不起作用,因为你在考虑多行,这就像是同一类项目的不同实例。如果您正在查找itemid=1和itemid=2的行,您将永远不会得到任何结果,因为没有一行满足此条件
相反,您可以查看特定发票的整个行集合,并在聚合中查看它们。实际上,您所说的是“我想要发票ID,其中明细行数为2,最低的项目ID为1,最高的为2”-这是“跨多行查看”并选择聚合属性:
SELECT InvoiceID
FROM InvoiceItems
GROUP BY InvoiceID
HAVING
COUNT(*) = 2 AND
MIN(ItemId) = 1 AND
MAX(ItemID) = 2
注:
- 如果InvoiceID、ItemID是唯一的,则可以忽略计数检查
- 如果您想从中获取信息,请将其放入子查询并随后加入发票表
SELECT InvoiceID
FROM InvoiceItems
GROUP BY InvoiceID
HAVING
SUM(CASE ItemID
WHEN 9 THEN 2
WHEN 38 THEN 4
WHEN 483 THEN 8
ELSE 1 END
) = 14 AND
COUNT(*) = 3
通过将数字转换为2、4或8并指定3项,只有一种方法可以达到14
而不是在
我理解你的意思,但它不起作用,因为你在考虑多行,这就像是同一类项目的不同实例。如果您正在查找itemid=1和itemid=2的行,您将永远不会得到任何结果,因为没有一行满足此条件
相反,您可以查看特定发票的整个行集合,并在聚合中查看它们。实际上,您所说的是“我想要发票ID,其中明细行数为2,最低的项目ID为1,最高的为2”-这是“跨多行查看”并选择聚合属性:
SELECT InvoiceID
FROM InvoiceItems
GROUP BY InvoiceID
HAVING
COUNT(*) = 2 AND
MIN(ItemId) = 1 AND
MAX(ItemID) = 2
注:
- 如果InvoiceID、ItemID是唯一的,则可以忽略计数检查
- 如果您想从中获取信息,请将其放入子查询并随后加入发票表
SELECT InvoiceID
FROM InvoiceItems
GROUP BY InvoiceID
HAVING
SUM(CASE ItemID
WHEN 9 THEN 2
WHEN 38 THEN 4
WHEN 483 THEN 8
ELSE 1 END
) = 14 AND
COUNT(*) = 3
通过将数字转换为2、4或8并指定3个项目,只有一种方法可以达到14..这假设始终有2个项目行,项目ID为1和2。这只是我的例子。如果所需的itemid是9、38和483呢?换句话说,一个可变数量的项目和各种ID。您的“示例”看起来像一个规范。。我将做一个editThis假设总是有两行条目,条目ID为1和2。这只是我的例子。如果所需的itemid是9、38和483呢?换句话说,一个可变数量的项目和各种ID。您的“示例”看起来像一个规范。。我来编辑一下