返回具有一个值而不是另一个值的行

时间:2017-09-08 20:14:13

标签: mysql

对于每个相同的日期(这只是表格的一个部分),我想要返回购买A但不购买B的帐号,以及另一个查询,反之亦然。所以运行A的第一个查询但没有B应该返回2和5.运行反之亦然查询B但没有A应该给我4.感谢您的帮助。我假设我不得不在桌子上加入一些但是我被卡住了。

+----+----------------+---------------+----------+--+--+
| ID | Account Number | Purchase Type |   Date   |  |  |
+----+----------------+---------------+----------+--+--+
|  1 |              1 | A             | 20140301 |  |  |
|  1 |              1 | A             | 20140301 |  |  |
|  1 |              1 | B             | 20140301 |  |  |
|  2 |              2 | A             | 20140301 |  |  |
|  3 |              3 | A             | 20140301 |  |  |
|  3 |              3 | B             | 20140301 |  |  |
|  4 |              4 | B             | 20140301 |  |  |
|  5 |              5 | A             | 20140301 |  |  |
|  5 |              5 | A             | 20140301 |  |  |
+----+----------------+---------------+----------+--+--+

6 个答案:

答案 0 :(得分:1)

不确定它是否一定是最佳方法,但内部select将起作用:

select distinct account_number
from purchases p
where purchase_type = "A" and account_number not in
(
  select account_number
  from purchases
  where purchase_date = p.purchase_date and purchase_type = "B"
)

您首先收集购买类型为“B”的所有ID,然后收集购买类型为“A”且不在第一个集合中的所有ID。

(假设您的表格为purchasesIDid intPurchase Datepurchase_date char(1)Datepurchase_date char(8),但是您应该能够使查询适应您的实际列。

相应的小提琴:http://sqlfiddle.com/#!9/edf73f/7/0

答案 1 :(得分:1)

您可以在同一张桌子上使用Exists

select distinct AccountNumber , Date
from table1 outer_table 
where PurchaseType = 'A' and not exists
  (
    select ID 
    from table1 inner_table 
    where
       PurchaseType = 'B' 
       and inner_table.Date = outer_table.Date 
       and inner_table.AccountNumber = outer_table.AccountNumber
   )

小提琴:http://sqlfiddle.com/#!9/b84ecd/9

答案 2 :(得分:1)

mov $str, %rdi

小提琴:here

并将两个请求合二为一:

select id,sum(if(purchase_type='A',1,0)) as sumA,sum(if(purchase_type='B',1,0)) as sumB

from purchases

group by id

having sumA>0 and sumB=0

小提琴:http://sqlfiddle.com/#!9/edf73f/16

答案 3 :(得分:1)

一种方法是使用完全外连接,其中一方或另一方为空;但mySQL不支持它们。所以要模拟:使用左连接然后是一个联合(或者如果你想保持1,1,A存在两次这一事实的联合所有。)我们只需在第二个SQL的连接之间切换标准就可以处理联合两种方式。

DEMO在评论中使用SQL小提琴:http://sqlfiddle.com/#!9/52c893/20/0

WHERE

答案 4 :(得分:0)

SELECT GROUP_CONCAT( DISTINCT   A.account SEPARATOR ', ') AS "accounts"
FROM test A, test B
WHERE A.type='A'
AND A.id=B.id
AND A.date=B.date
AND A.date='2014-03-01'

答案 5 :(得分:0)

你在这里搞砸了,因为MySQL的设定算术运算不完整。它有UNIONINTERSECT但不是EXCEPT。如果它有EXCEPT你可以做

SELECT DISTINCT `Account Number` FROM purch WHERE `Purchase Type` = 'A' 
EXCEPT    /* MySQL fail! */
SELECT DISTINCT `Account Number` FROM purch WHERE `Purchase Type` = 'B' 

你的问题就会解决。

因此,您可以使用LEFT JOIN ... IS NULL查询模式。它更冗长但工作正常。 (http://sqlfiddle.com/#!9/52c893/18/0

SELECT  suba.`Account Number`

 FROM (
          SELECT DISTINCT `Account Number`
            FROM purch
           WHERE `Purchase Type` = 'A'
       ) suba
  LEFT JOIN (
          SELECT DISTINCT `Account Number`
            FROM purch
           WHERE `Purchase Type` = 'B'
       ) subb ON suba.`Account Number` =  subb.`Account Number`
 WHERE subb.`Account Number` IS NULL