Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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查询自2017年以来未开具发票的2017年以前的顶级客户端_Sql_Sql Server_Subquery - Fatal编程技术网

SQL Server查询自2017年以来未开具发票的2017年以前的顶级客户端

SQL Server查询自2017年以来未开具发票的2017年以前的顶级客户端,sql,sql-server,subquery,Sql,Sql Server,Subquery,我正试图写一个查询,列出2017年以前的前200名客户,这些客户自2017年以来没有任何发票金额 我尝试了一些查询的变体,但仍然得到了0个结果,我知道这在默认情况下是不准确的,但我在Excel中获得了正确的信息。我在子查询方面没有太多经验,因此看到了一个解决子查询的机会 SELECT TOP 200 SUM(OI.OrderInvoiceTotalAmount) AS 'Invoiced', O.Deal, CASE WHEN O.Location LIKE

我正试图写一个查询,列出2017年以前的前200名客户,这些客户自2017年以来没有任何发票金额

我尝试了一些查询的变体,但仍然得到了0个结果,我知道这在默认情况下是不准确的,但我在Excel中获得了正确的信息。我在子查询方面没有太多经验,因此看到了一个解决子查询的机会

SELECT TOP 200
    SUM(OI.OrderInvoiceTotalAmount) AS 'Invoiced',
    O.Deal,
    CASE
       WHEN O.Location LIKE '%Vegas%' THEN 'Las Vegas'
        WHEN O.Location LIKE '%New%' THEN 'New Jersey'
        WHEN O.Location LIKE '%Orange%' THEN 'Los Angeles'
        WHEN O.Location LIKE '%Angeles%' THEN 'Los Angeles'
        WHEN O.Location LIKE '%Angeles%' AND O.OrderType = 'System' THEN 'Las Vegas'
        WHEN O.Location LIKE '%DC%' THEN 'Washington DC'
        WHEN O.Location LIKE '%DC%' AND O.OrderType = 'System' THEN 'New Jersey'
        WHEN O.Location LIKE '%Nashville%' THEN 'Tennessee'
        WHEN O.Location LIKE '%Nashville%' AND O.OrderType = 'System' THEN 'Las Vegas'
        WHEN O.Location LIKE '%Houston%' THEN 'Houston'
        WHEN O.Location LIKE '%Orlando%' THEN 'Orlando'
        WHEN O.Location LIKE 'Penn%' THEN 'Pennsylvania'
        WHEN O.Location='Enterprises' THEN 'Entertainment'
        ELSE O.Location
    END AS 'Location'
FROM 
    dbo.OrderInvoice as OI
INNER JOIN 
    dbo.Orders as O ON O.OrderKey = OI.OrderKey
INNER JOIN 
    dbo.Invoice as I on I.InvoiceKey = OI.InvoiceKey
WHERE 
    O.Status NOT IN ('Snapshot', 'Cancelled', 'Void')
    AND I.InvoiceStatusCode <> 'Estimate'
    AND I.InvoiceType = 'Billing'
    AND Year(I.InvoiceDate) < '2017'
    AND O.Deal NOT LIKE '%4Wall%'
    AND O.Location LIKE '%Nashville%'
GROUP BY
    O.Deal,
    CASE
        WHEN O.Location LIKE '%Vegas%' THEN 'Las Vegas'
        WHEN O.Location LIKE '%New%' THEN 'New Jersey'
        WHEN O.Location LIKE '%Orange%' THEN 'Los Angeles'
        WHEN O.Location LIKE '%Angeles%' THEN 'Los Angeles'
        WHEN O.Location LIKE '%Angeles%' AND O.OrderType = 'System' THEN 'Las Vegas'
        WHEN O.Location LIKE '%DC%' THEN 'Washington DC'
        WHEN O.Location LIKE '%DC%' AND O.OrderType = 'System' THEN 'New Jersey'
        WHEN O.Location LIKE '%Nashville%' THEN 'Tennessee'
        WHEN O.Location LIKE '%Nashville%' AND O.OrderType = 'System' THEN 'Las Vegas'
        WHEN O.Location LIKE '%Houston%' THEN 'Houston'
        WHEN O.Location LIKE '%Orlando%' THEN 'Orlando'
        WHEN O.Location LIKE 'Penn%' THEN 'Pennsylvania'
        WHEN O.Location = 'Enterprises' THEN 'Entertainment'
        ELSE O.Location
    END
HAVING
    (SELECT SUM(OI.OrderInvoiceTotalAmount)
     FROM dbo.OrderInvoice as OI
     INNER JOIN dbo.Invoice as I on OI.InvoiceKey=I.InvoiceKey
     INNER JOIN dbo.Orders as O on OI.OrderKey=O.OrderKey
     WHERE YEAR(I.InvoiceDate) > '2017' 
       AND I.InvoiceStatusCode <> 'Estimate'
       AND I.InvoiceType = 'Billing'
       AND O.Deal NOT LIKE '%4Wall%'
       AND O.Location LIKE '%Nashville%') = 0
如果我需要添加更多信息,请告诉我


感谢好心人

在检查缺少的行时,使用“不存在”比实际进行计数和检查是否为0要快。在比较之前,引擎必须对所有行进行计数。我已经评论了我编辑的行。基本上删除了HAVING,并在WHERE上添加了一个NOT EXISTS


我假设相关查询的链接是通过交易列。

不相关:当O.Location(如“%Angeles%”时,则为“Los Angeles”;当O.Location(如“%Angeles%”)和O.OrderType='System'时,则“Las Vegas”将永远不会返回“Las Vegas”,因为第一个案例也与O.OrderType='System'匹配。将更具体的案例放在第一位,或将和O.OrderType“System”添加到不太具体的案例中。模拟“%Nashville%”和“%DC%”。开枪!没错,达格。谢谢@StickyBit只要说拥有SumOI.OrderInvoiceTotalAmount=0工具,就可以使用新的物品!谢谢@EZlo,效果很好。哦,是的,谢谢你额外提醒我何时使用不同的别名。
Select TOP 200
Sum(OI.OrderInvoiceTotalAmount) as 'Invoiced',
O.Deal,
Case
    When O.Location Like '%Vegas%' Then 'Las Vegas'
    When O.Location Like '%New%' Then 'New Jersey'
    When O.Location Like '%Orange%' Then 'Los Angeles'
    When O.Location Like '%Angeles%' Then 'Los Angeles'
    When O.Location Like '%Angeles%' AND O.OrderType='System' Then 'Las Vegas'
    When O.Location Like '%DC%' Then 'Washington DC'
    When O.Location Like '%DC%' AND O.OrderType='System' Then 'New Jersey'
    When O.Location Like '%Nashville%' Then 'Tennessee'
    When O.Location Like '%Nashville%' AND O.OrderType='System' Then 'Las Vegas'
    When O.Location Like '%Houston%' Then 'Houston'
    WHen O.Location Like '%Orlando%' Then 'Orlando'
    When O.Location Like 'Penn%' Then 'Pennsylvania'
    When O.Location='Enterprises' Then 'Entertainment'
    Else O.Location
End as 'Location'

From dbo.OrderInvoice as OI
Inner Join dbo.Orders as O on O.OrderKey=OI.OrderKey
Inner Join dbo.Invoice as I on I.InvoiceKey=OI.InvoiceKey

Where O.Status Not In ('Snapshot','Cancelled','Void')
AND I.InvoiceStatusCode<>'Estimate'
AND I.InvoiceType='Billing'
AND Year(I.InvoiceDate)<'2017'
AND O.Deal Not Like '%4Wall%'
AND O.Location Like '%Nashville%'

-- no record from 2017 must exist
AND NOT EXISTS (
    SELECT 
        'no record from 2017'
    From dbo.OrderInvoice as XOI -- Note that we use different alias here so it doesn't get mixed up
    Inner Join dbo.Invoice as XI on XOI.InvoiceKey=XI.InvoiceKey
    Inner Join dbo.Orders as XO on XOI.OrderKey=XO.OrderKey
    Where Year(XI.InvoiceDate)> 2017
        AND XI.InvoiceStatusCode<>'Estimate'
        AND XI.InvoiceType='Billing'
        AND XO.Deal Not Like '%4Wall%'
        AND XO.Location Like '%Nashville%'

        AND O.Deal = XO.Deal -- link between the outmost query and the correlated query
    )

Group By
O.Deal,
Case
    When O.Location Like '%Vegas%' Then 'Las Vegas'
    When O.Location Like '%New%' Then 'New Jersey'
    When O.Location Like '%Orange%' Then 'Los Angeles'
    When O.Location Like '%Angeles%' Then 'Los Angeles'
    When O.Location Like '%Angeles%' AND O.OrderType='System' Then 'Las Vegas'
    When O.Location Like '%DC%' Then 'Washington DC'
    When O.Location Like '%DC%' AND O.OrderType='System' Then 'New Jersey'
    When O.Location Like '%Nashville%' Then 'Tennessee'
    When O.Location Like '%Nashville%' AND O.OrderType='System' Then 'Las Vegas'
    When O.Location Like '%Houston%' Then 'Houston'
    WHen O.Location Like '%Orlando%' Then 'Orlando'
    When O.Location Like 'Penn%' Then 'Pennsylvania'
    When O.Location='Enterprises' Then 'Entertainment'
    Else O.Location
End