不存在查询

时间:2017-10-04 12:33:57

标签: sql

我试图找到客户,那些在过去2年内没有订购的客户,他们今年订购了500多个..我写了这个查询,我使用了" NOT EXISTS"条件,但它仍然显示我错误的结果。 一些建议将不胜感激。

我的代码:

SELECT
         "Sales"."Kundennummer" as 'Neuer Kunde',
         year("Sales"."Datum"),
         sum("Sales"."Umsatz mit Steuer") as "Umsatz"
FROM  "Sales" 
WHERE year("Sales"."Datum")  = '2017'
 AND NOT EXISTS
    (
    SELECT "Sales"."Kundennummer"
    FROM  "Sales" 
    WHERE    year("Sales"."Datum")  = '2015'
     AND    year("Sales"."Datum")  = '2016'
    )
GROUP BY
 "Sales"."Kundennummer",
      "Sales"."Datum" 
HAVING sum("Sales"."Umsatz mit Steuer")  > 500  

3 个答案:

答案 0 :(得分:1)

NOT EXISTS子句中的查询可能会产生0行,因为行不能Datum2015 2016。因此它应该是OR而不是AND

另外,如果你解决这个问题,子查询和超级查询之间没有链接,这意味着它将为任何客户返回行(假设在表格中存在一个带有Datum 2015或2016的行,我猜它确实)。

所以,比如:

SELECT
         "Sales"."Kundennummer" as 'Neuer Kunde',
         year("Sales"."Datum"),
         sum("Sales"."Umsatz mit Steuer") as "Umsatz"
FROM  "Sales" sales
WHERE year("Sales"."Datum")  = '2017'
 AND NOT EXISTS
    (
    SELECT "Sales"."Kundennummer"
    FROM  "Sales" salesI
    WHERE salesI."Kundennummer" = sales."Kundennummer"
      AND (year("Sales"."Datum")  = '2015'
           OR year("Sales"."Datum")  = '2016')
    )
GROUP BY
 "Sales"."Kundennummer",
      "Sales"."Datum" 
HAVING sum("Sales"."Umsatz mit Steuer")  > 500  

答案 1 :(得分:0)

您的EXISTS查询与主查询无关,即它不会查找相关Kundennummer的数据,但是是否有任何记录2015年和2016年。

(使用AND时,你也必须OR,并且你不应该在2015'这样的数字上使用引号,并且你不应该使用单一引用'Neuer Kunde'等名称。)

应该是

AND NOT EXISTS
(
  SELECT *
  FROM Sales other_years
  WHERE other_years.Kundennummer = Sales.Kundennummer
    AND year(other_years.Datum) in (2015, 2016)
)

或与NOT IN

不相关
AND Kundennummer NOT IN
(
  SELECT Kundennummer
  FROM  Sales
  WHERE year(Datum) in (2015, 2016)
)

请注意,使用NOT IN时,子查询必须返回空值。例如。正如人们所预料的那样,where 3 not in (1, 2, null)不会导致真实,因为DBMS认为未知值(null)很可能是3: - )

答案 2 :(得分:0)

我建议你在下面用3种不同的方法来做到这一点:

  1. 加入2个表

    select this_year_sales.kundenummer, this_year_sales.tot_umsatz
    from (select sum(umsatz) tot_umsatz, kundenummer from sales where extract(year from (datum)) = extract(year from sysdate) group by kundenummer) this_year_sales
    , (select kundenummer, max(datum) max_datum from sales where datum < trunc(sysdate, 'year') group by kundenummer) previous_sales
    where this_year_sales.kundenummer = previous_sales.kundenummer
    and extract(year from previous_sales.max_datum) < (extract(year from sysdate)-2) 
    and this_year_sales.tot_umsatz > 500;
    
  2. 使用NOT INT

    select kundenummer, sum(umsatz)
    from sales s
    where extract(year from datum) = extract(year from sysdate)
    and kundenummer not in (select kundenummer from sales where extract(year from datum) > (extract(year from sysdate) - 2) and extract(year from datum) < (extract(year from sysdate)-1))
    group by kundenummer
    having sum(umsatz) > 500;
    
  3. 使用NOT EXISTS

    select kundenummer, sum(umsatz)
    from sales s
    where extract(year from datum) = extract(year from sysdate)
    and not exists(
    select s1.kundenummer, s1.datum from sales s1 where extract (year from s1.datum) >= (extract(year from sysdate)-2) and extract(year from s1.datum) < extract (year from sysdate) and s1.kundenummer = s.kundenummer
    )
    group by kundenummer
    having sum(umsatz) > 500;