Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 SELECT语句-根据第二个表中的匹配数选择记录_Sql - Fatal编程技术网

SQL SELECT语句-根据第二个表中的匹配数选择记录

SQL SELECT语句-根据第二个表中的匹配数选择记录,sql,Sql,这是我的第一个问题,很抱歉违反了任何潜规则。我目前正在尝试使用InventoryItem表中的主键从InventoryCategory表中检索类别 由于一个项目可以有一个或多个类别,InventoryCategory表包含ItemCode、CategoryCode和IsPrimary以定义哪个类别是主要类别,哪个类别是TRUE/FALSE类型 我真的需要对只有一个类别的所有项目使用主类别,对有两个类别的项目使用非主类别。我试图使用CASE语句将正确的值输出为命名的ParentCategory字段

这是我的第一个问题,很抱歉违反了任何潜规则。我目前正在尝试使用InventoryItem表中的主键从InventoryCategory表中检索类别

由于一个项目可以有一个或多个类别,InventoryCategory表包含ItemCode、CategoryCode和IsPrimary以定义哪个类别是主要类别,哪个类别是TRUE/FALSE类型

我真的需要对只有一个类别的所有项目使用主类别,对有两个类别的项目使用非主类别。我试图使用CASE语句将正确的值输出为命名的ParentCategory字段,但时间不长

目前,我只知道其中IC.IsPrimary=1,因为我还不知道如何查询ItemCode以返回CategoryCodes,并基于此选择非主要类别。我试着数一数,但它总是返回1,并继续出击

代码:


如果非主要行的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