带有计数的SQL查询仅返回等效计数

时间:2018-05-15 19:51:09

标签: sql sql-server

我有一个包含1个表和2个子查询的查询。该表是所有客户的列表,1个子查询列出了客户在一段时间内给出的所有报价,而另一个子查询是在同一时间段内为客户预订的所有订单的列表。我要做的是返回一个客户的结果集,给出的报价数量,以及在给定时间段内预订的订单数量。然而,我要归还的只是在一段时间内听取客户的同等报价和订单数量。我觉得我在查询的上下文中遗漏了一些明显的东西,但我无法弄明白。任何帮助,将不胜感激。谢谢。

结果集应如下所示

客户-------行情-------下订单

AAA ---------------- 4 ---------------- 4

BBB ---------------- 9 ---------------- 18

CCC ---------------- 18 ---------------- 9

select 
    [Customer2].[Name] as [Customer2_Name],
    (count( Quotes.UD03_Key3 )) as [Calculated_CustomerQuotes],
    (count( Customer_Bookings.OrderHed_OrderNum )) as [Calculated_CustomerBookings]
from Erp.Customer as Customer2
left join  (select 
    [UD03].[Key3] as [UD03_Key3],
    [UD03].[Key4] as [UD03_Key4],
    [UD03].[Key1] as [UD03_Key1],
    [UD03].[Date02] as [UD03_Date02]
from Ice.UD03 as UD03
inner join Ice.UD02 as UD02 on 
    UD03.Company = UD02.Company
And
    CAST(CAST(UD03.Number09 AS INT) AS VARCHAR(30)) = UD02.Key1

left outer join Erp.Customer as Customer on 
    UD03.Company = Customer.Company
And
    UD03.Key1 = Customer.Name

left outer join Erp.SalesTer as SalesTer on 
    Customer.Company = SalesTer.Company
And
    Customer.TerritoryID = SalesTer.TerritoryID

left outer join Erp.CustGrup as CustGrup on 
    Customer.Company = CustGrup.Company
And
    Customer.GroupCode = CustGrup.GroupCode

 where (UD03.Key3 <> '0'))  as Quotes on 
    Customer2.Name = Quotes.UD03_Key1

left join  (select 
    [Customer1].[Name] as [Customer1_Name],
    [OrderHed].[OrderNum] as [OrderHed_OrderNum],
    [OrderDtl].[OrderLine] as [OrderDtl_OrderLine],
    [OrderHed].[OrderDate] as [OrderHed_OrderDate]
from Erp.OrderHed as OrderHed
inner join Erp.Customer as Customer1 on 
    OrderHed.Company = Customer1.Company
And
    OrderHed.BTCustNum = Customer1.CustNum

inner join Erp.OrderDtl as OrderDtl on 
    OrderHed.Company = OrderDtl.Company
And
    OrderHed.OrderNum = OrderDtl.OrderNum)  as Customer_Bookings on 
    Customer2.Name = Customer_Bookings.Customer1_Name

 where Quotes.UD03_Date02 >= '5/15/2018'  and Quotes.UD03_Date02 <= '5/15/2018'  and Customer_Bookings.OrderHed_OrderDate >='5/15/2018'  and Customer_Bookings.OrderHed_OrderDate <= '5/15/2018'

group by [Customer2].[Name]

2 个答案:

答案 0 :(得分:1)

你有几个问题在这里发生。第一个问题是你的代码格式太差,用户看起来很敌意。然后,由于where子句,您将左连接在逻辑上视为内连接。您还具有特定语言格式的日期文字字符串。这应该始终是ANSI格式YYYYMMDD。但在你的情况下,你的两个谓词相互矛盾。 UD03_Date02同时大于和小于同一日期。谢天你有=。但是,如果您的列是日期时间,则您已阻止再次返回任何行(第一个是您的where子句)。你有相同的错误日期逻辑,并加入第二个子查询。

以下是您的查询可能与某些格式相似的内容,以便您可以看到正在发生的事情。请注意我修复了逻辑连接问题。你仍然有日期问题,因为我不知道你想要在那里完成什么。

select 
    [Customer2].[Name] as [Customer2_Name],
    count(Quotes.UD03_Key3) as [Calculated_CustomerQuotes],
    count(Customer_Bookings.OrderHed_OrderNum) as [Calculated_CustomerBookings]
from Erp.Customer as Customer2
left join  
(
    select 
        [UD03].[Key3] as [UD03_Key3],
        [UD03].[Key4] as [UD03_Key4],
        [UD03].[Key1] as [UD03_Key1],
        [UD03].[Date02] as [UD03_Date02]
    from Ice.UD03 as UD03
    inner join Ice.UD02 as UD02 on UD03.Company = UD02.Company
                        And CAST(CAST(UD03.Number09 AS INT) AS VARCHAR(30)) = UD02.Key1
    left outer join Erp.Customer as Customer on UD03.Company = Customer.Company
                        And UD03.Key1 = Customer.Name
    left outer join Erp.SalesTer as SalesTer on Customer.Company = SalesTer.Company
                        And Customer.TerritoryID = SalesTer.TerritoryID
    left outer join Erp.CustGrup as CustGrup on Customer.Company = CustGrup.Company
                        And Customer.GroupCode = CustGrup.GroupCode
     where UD03.Key3 <> '0'
)  as Quotes on Customer2.Name = Quotes.UD03_Key1
    and Quotes.UD03_Date02 >= '20180515'  
    and Quotes.UD03_Date02 <= '20180515' 
left join  
(
    select 
        [Customer1].[Name] as [Customer1_Name],
        [OrderHed].[OrderNum] as [OrderHed_OrderNum],
        [OrderDtl].[OrderLine] as [OrderDtl_OrderLine],
        [OrderHed].[OrderDate] as [OrderHed_OrderDate]
    from Erp.OrderHed as OrderHed
    inner join Erp.Customer as Customer1 on OrderHed.Company = Customer1.Company
                        And OrderHed.BTCustNum = Customer1.CustNum
    inner join Erp.OrderDtl as OrderDtl on OrderHed.Company = OrderDtl.Company
                        And OrderHed.OrderNum = OrderDtl.OrderNum
)  as Customer_Bookings on Customer2.Name = Customer_Bookings.Customer1_Name
    and Customer_Bookings.OrderHed_OrderDate >= '20180515'  
    and Customer_Bookings.OrderHed_OrderDate <= '20180515'
group by [Customer2].[Name]

答案 1 :(得分:0)

COUNT()只会给你一些记录。您希望这两个结果列相等。尝试像这样构建它:

SUM(CASE WHEN Quote.UD03_Key1 IS NOT NULL THEN 1 ELSE 0 END) AS QuoteCount, 
SUM(CASE WHEN Customer_Bookings.Customer1_Name IS NOT NULL THEN 1 ELSE 0 END) AS custBookingCount