【问题标题】:Compare rows and columns of same table比较同一张表的行和列
【发布时间】:2015-09-11 11:38:51
【问题描述】:
+--------------+--------------+------------+
| company_name | address_type |  address   |
+--------------+--------------+------------+
| Company A    | Billing      | 111 Street |
| Company A    | Shipping     | 111 Street |
| Company B    | Billing      | 222 Street |
| Company B    | Shipping     | 333 street |
| Company B    | Shipping     | 444 street |
+--------------+--------------+------------+

我有一张类似的桌子。
我需要的是帐单地址和送货地址不同的所有公司

注意 - 每家公司只有一个帐单地址。但它可以有多个送货地址

这似乎是一个相当简单的查询,但我无法得到它。

我的尝试 - 我尝试从账单中“减去”所有送货地址,但没有输出。 不同也无济于事

查询:

select company_name 
from tableA 
where address_type='Billing' 
and company_name not in (select to_char(company_name) from tableA where address_type='Shipping');

输出应该是公司B(因为它的帐单和送货地址不同)

编辑 1:尝试了 Indra 的查询,但它永远运行。没有回应

select A.* from company A inner join company B on A.company_Name = B.company_Name
and (A.address_type = 'Billing' and B.address_type = 'Shipping') 
AND A.address <> B.address 

【问题讨论】:

  • My attempt 显示..
  • select company_name from tableA where address_type='Billing' and company_name not in (select to_char(company_name) from tableA where address_type='Shipping');
  • 您使用的是什么数据库管理系统?甲骨文? MySQL? SQL Server?...

标签: sql oracle toad


【解决方案1】:

使用join 怎么样?下面显示了所有不同的对:

select tb.*, ts.*
from company tb join
     company ts
     on tb.company_name = ts.company_name and
        ts.address_type = 'shipping' and
        tb.address_type = 'billing' and
        ts.address <> tb.address;

如果您只想要不同的公司:

select company_name
from company t
group by company_name
having count(distinct case when t.address_type = 'billing' then address end) = 1 and
       count(distinct case when t.address_type = 'shipping' then address end) = 1 and
       (max(case when t.address_type = 'billing' then address end) <>
        max(case when t.address_type = 'shipping' then address end)
       );

注意:这还会检查是否只有一个不同的帐单和送货地址。

【讨论】:

    【解决方案2】:

    使用下面的查询

    select A.* from company A inner join company B on A.company_Name = B.company_Name
    and (A.address_type = 'Billing' and B.address_type = 'Shipping') 
    AND A.address <> B.address   
    

    【讨论】:

    • 大约有一百万行,而且不只是两家公司。有几家公司。也只是一张桌子
    • @user155581 请相应地更新您的问题....以及为什么这对您不起作用。
    • 查询进入无限循环。 (现在执行时间超过 5 分钟,但没有响应。)通常响应时间是几毫秒
    • @user155581,你也可以使用这个查询select distinct c.company_name from comp C where address_type = 'Billing' and not exists( select 1 from comp where c.company_Name = company_Name and address_type = 'Shipping' and c.address &lt;&gt;address )
    【解决方案3】:

    在这个SQL Fiddle example,你可以找到另外一家公司的其他方法:

    +--------------+--------------+------------+
    | company_name | address_type |  address   |
    +--------------+--------------+------------+
    | Company A    | Billing      | 111 Street |
    | Company A    | Shipping     | 111 Street |
    | Company B    | Billing      | 222 Street |
    | Company B    | Shipping     | 333 street |
    | Company B    | Shipping     | 444 street |
    | Company C    | Shipping     | 555 street |
    | Company C    | Shipping     | 666 street |
    | Company C    | Billing      | 555 street |
    | Company C    | Billing      | 666 street |
    +--------------+--------------+------------+
    

    POSTDATA:SQL Fiddle 对我来说很好用。这是所有代码:

    架构:

    CREATE TABLE companies
    ( 
      company_name  VARCHAR2(40),
      address_type  VARCHAR2(40),
      address    VARCHAR2(40)
    );
    
    insert into companies values ('Company A','Billing','111 Street' );
    insert into companies values ('Company A','Shipping','111 Street' );
    insert into companies values ('Company B','Billing','222 Street' );
    insert into companies values ('Company B','Shipping','333 street' );
    insert into companies values ('Company B','Shipping','444 street');
    insert into companies values ('Company C','Billing','555 Street' );
    insert into companies values ('Company C','Billing','666 Street' );
    insert into companies values ('Company C','Shipping','555 Street' );
    insert into companies values ('Company C','Shipping','666 Street' );
    

    句子:

    SELECT DISTINCT(comp.company_name) FROM
        (select company_name, address, count(*) regs
        from companies
        group by company_name, address) comp
    WHERE MOD(comp.regs,2) = 1;
    

    结果:

    Company B
    

    【讨论】:

    • 每次我点击你的链接时,SQL 小提琴都会崩溃。你能检查一次吗? (或分享完整代码)
    • 另外,每家公司只有一个收货地址。但它可以有多个送货地址
    • 那么,如果收货地址存在于帐单地址中,是不是“可丢弃”的公司,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2022-01-27
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多