SQL SELECT语句-根据第二个表中的匹配数选择记录
这是我的第一个问题,很抱歉违反了任何潜规则。我目前正在尝试使用InventoryItem表中的主键从InventoryCategory表中检索类别 由于一个项目可以有一个或多个类别,InventoryCategory表包含ItemCode、CategoryCode和IsPrimary以定义哪个类别是主要类别,哪个类别是TRUE/FALSE类型 我真的需要对只有一个类别的所有项目使用主类别,对有两个类别的项目使用非主类别。我试图使用CASE语句将正确的值输出为命名的ParentCategory字段,但时间不长 目前,我只知道其中IC.IsPrimary=1,因为我还不知道如何查询ItemCode以返回CategoryCodes,并基于此选择非主要类别。我试着数一数,但它总是返回1,并继续出击 代码:SQL SELECT语句-根据第二个表中的匹配数选择记录,sql,Sql,这是我的第一个问题,很抱歉违反了任何潜规则。我目前正在尝试使用InventoryItem表中的主键从InventoryCategory表中检索类别 由于一个项目可以有一个或多个类别,InventoryCategory表包含ItemCode、CategoryCode和IsPrimary以定义哪个类别是主要类别,哪个类别是TRUE/FALSE类型 我真的需要对只有一个类别的所有项目使用主类别,对有两个类别的项目使用非主类别。我试图使用CASE语句将正确的值输出为命名的ParentCategory字段
如果非主要行的IsPrimary字段为0,则可以执行SELECT MIN语句。见下文:
SELECT BillToCode
, POSWorkstationID
, InvoiceDate
, ItemName
, CategoryCode
, SUM(QtySales) QtySales
, SUM(Sales) Sales
, SUM(QtyReturns) QtyReturns
, SUM([Returns]) [Returns]
, WarehouseCode
FROM (
SELECT CI.BillToCode
, CI.WarehouseCode
, CI.POSWorkstationID
, CI.InvoiceDate
, IC.CategoryCode
, ii.ItemName
, CASE WHEN CI.Type IN ('Invoice', 'Opening Invoice') THEN CID.QuantityShipped ELSE 0 END AS QtySales
, CASE WHEN CI.Type IN ('Invoice', 'Opening Invoice') THEN CID.ExtPriceRate ELSE 0 END AS Sales
, CASE WHEN CI.Type IN ('Credit Memo', 'Opening Credit', 'Gift Card', 'Gift Certificate') THEN CID.QuantityShipped ELSE 0 END AS QtyReturns
, CASE WHEN CI.Type IN ('Credit Memo', 'Opening Credit', 'Gift Card', 'Gift Certificate') THEN CID.ExtPriceRate ELSE 0 END AS [Returns]
FROM CustomerInvoice CI
INNER JOIN Customer C ON CI.BillToCode = C.CustomerCode
INNER JOIN CustomerInvoiceDetail CID ON CI.InvoiceCode = CID.InvoiceCode
INNER JOIN InventoryItem ii ON CID.ItemCode = ii.ItemCode
INNER JOIN InventoryCategory IC ON CID.ItemCode = IC.ItemCode
WHERE (CI.IsBatch = 0 OR CI.IsBatch IS NULL)
AND CI.IsPosted = 1
AND CI.[Type] = 'Invoice' AND CI.IsVoided = 0
AND IC.IsPrimary = (SELECT MIN(IsPrimary) FROM InventoryCategory ICi WHERE ICi.ItemCode = IC.ItemCode)
) Items
GROUP BY POSWorkstationID, BillToCode, ItemName, InvoiceDate, CategoryCode, WarehouseCode
假设您的InventoryCategory数据如下所示:
ItemCode CategoryCode IsPrimary
abc def 1
abc xyz 0
abc 123 0
使用派生表子查询而不是连接到该表,例如:
inner join (
select
ItemCode
, max(case when IsPrimary = 1 then CategoryCode end) PrimCategory
, max(case when IsPrimary = 0 then CategoryCode end) SecCategory
, min(CategoryCode) as tertiaryCategory
from InventoryCategory
group by ItemCode
) IC ON CID.ItemCode = IC.ItemCode
然后在主select子句中,您可以使用以下表达式或case表达式:
COALESCE(IC.PrimCategory,IC.SecCategory,IC.tertiaryCategory) as CategoryCode
如果将其拆分为两个查询会怎么样:一个查询获取一个类别中的项目,另一个查询获取两个+类别中的项目?您希望获取的类别是三个或更多?SQL问题的一个口头规则(与未口头规则相反)是1。样本数据,以及2。预期的结果,使它更容易实现。传达您的需求,然后b。让社区来回答你。e、 你想要两列类别吗?还是两排?Diego的问题:如果超过2行,会发生什么?关于如何提问的提示:基础知识:更多信息:注意示例代码和数据这是一个case表达式,而不是case语句…答案基于假设您想要2列作为类别,但您已经表示想要2行;因此,这可能不是您的解决方案,但这是一种在某些时候您可能会发现有用的替代方法。谢谢,@wyatt shipman!这样做效果更好。我还必须将MINIsPrimary更改为MINIsPrimary+0,因为我在尝试最小一位时遇到了操作数错误。
COALESCE(IC.PrimCategory,IC.SecCategory,IC.tertiaryCategory) as CategoryCode