2016-10-28 49 views
0

我已经试过了几个小时和不同的论坛,但无法让我的头来弄清楚这一点。我尝试过加入和各种各样,但我经常得到错误的结果。SQL相同的值但不同的辅助值

我的示例表看起来像下面

Item Branch Type 
A Main Box 
A London Single 
A Paris Single 
A Tokyo Box 
B Main Single 
B London Single 
B Paris Single 
C Main Single 
C London Box 
C Paris Single 
C Tokyo Single 
D Main Box 
D London Single 
D Paris Box 
D Tokyo Box 
D Sydney Single 

什么,我想为我的结果集是有不同的“类型”其主要“分公司”

举例而言,所有项目如果主要类型是框,则显示主要分支和其他具有不同类型的分支

结果表应如下所示。

Item Branch Type 
**A Main Box** 
A London Single 
A Paris Single 
**C Main Single** 
C London Box 
**D Main Box** 
D London Single 
D Sydney Single 

任何帮助,非常感谢。

感谢

+1

*“我尝试过加入和各种各样的......”*有很多有帮助的人,所以除非你显示你尝试过的东西,否则他们不会去回答。如果在问题中包含CREATE TABLE和INSERT语句,您也可能获得更多的回复。 –

+1

我不确定我的理解。为什么结果中不包含项目B的任何记录? –

+0

@ destination-data Hi来自B的任何记录都不在结果中,因为'B的所有其他分支中的主分支的类型相同,而其他分支中的其他项目的类型不同。希望这可以解释它 – Sinnerv

回答

1

这是为了做到这一点,以获得行,其中的任何分支类型从主分支不同的一种方式。

select * 
from t t1 
where (branch='Main' or (branch <> 'Main' 
         and exists (select 1 from t 
            where item=t1.item and branch = 'Main' 
            and type <> t1.type) 
         ) 
     ) 
and item in (select item from t group by item having count(distinct type) > 1) 

如果上面的查询显得扑朔迷离,你可以用一个CTE来获取所有非 - 主要分支,其类型从一个项目的主要分支不同。之后使用union all获取这些项目的主分支行。

with y as (
select * from t t1 
where branch <> 'Main' and exists (select 1 from t 
            where item=t1.item and branch = 'Main' 
            and type <> t1.type) 
    ) 
select * from t where branch='Main' and item in (select item from y) 
union all 
select * from y 
+0

非常感谢。它的作品完美! 我试过了, 嵌套选择查询 位作为单独的查询,并试图加入它与大表,但我感到困惑,试图匹配列,以及如何命名他们等我也发现了计数功能从其他类似的职位,但从来没有可能让我的脑袋把所有这些结合在一起。 – Sinnerv

0
select A.item, A.branch, A.type 
from ibt A, ibt B 
on A.item = B.item and B.branch = "Main" and A.type != B.type; 

结果为打击:

A|London|Single 
A|Paris|Single 
C|London|Box 
D|London|Single 
D|Sydney|Single 
+2

这里有一个很好的讨论[问题](http://stackoverflow.com/questions/128965/is-there-something-wrong-with-joins-that-dont-use-the-join-keyword -in-sql-or-my)在你的示例中使用的旧式连接上。 Tl; dr避免它们。改用ANSI连接。 –

+0

不错的建议,谢谢〜 – SmartXiaoMing

0

我不知道我是否理解你需要什么。 但是,这是一个可能的部分解决方案。 您可以根据您的要求改善这一点。

在postgre中的示例。

CREATE TEMPORARY TABLE items (
    item varchar(10), 
    branch varchar(10), 
    type varchar(10) 
); 


INSERT INTO items VALUES ('A', 'Main', 'Box'); 
INSERT INTO items VALUES ('A', 'London', 'Single'); 
INSERT INTO items VALUES ('A', 'Paris', 'Single'); 
INSERT INTO items VALUES ('A', 'Tokyo', 'Box'); 
INSERT INTO items VALUES ('B', 'Main', 'Single'); 
INSERT INTO items VALUES ('B', 'London', 'Single'); 
INSERT INTO items VALUES ('B', 'Paris', 'Single'); 
INSERT INTO items VALUES ('C', 'Main', 'Single'); 
INSERT INTO items VALUES ('C', 'London', 'Box'); 
INSERT INTO items VALUES ('C', 'Paris', 'Single'); 
INSERT INTO items VALUES ('C', 'Tokyo', 'Single'); 
INSERT INTO items VALUES ('D', 'Main', 'Box'); 
INSERT INTO items VALUES ('D', 'London', 'Single'); 
INSERT INTO items VALUES ('D', 'Paris', 'Box'); 
INSERT INTO items VALUES ('D', 'Tokyo', 'Box'); 
INSERT INTO items VALUES ('D', 'Sydney', 'Single'); 

SELECT 
CASE WHEN T.branch = 'Main' THEN rpad(T.item, length(T.item) + T.children::INT, '*') ELSE T.item END item, 
T.branch, 
T.type 
FROM (
SELECT 
    I.item, 
    I.branch, 
    I.type, 
    MAIN_ITEMS.item        mitem, 
    MAIN_ITEMS.branch       mbranch, 
    MAIN_ITEMS.type        mtype, 
    (SELECT count(j.item) 
    FROM items j 
    WHERE I.ITEM = j.item AND I.type <> j.type) children FROM items I 
    JOIN (
     SELECT 
      item, 
      branch, 
      type 
     FROM items 
     WHERE branch = 'Main' 

     ) MAIN_ITEMS 
    ON ((I.ITEM = MAIN_ITEMS.item AND I.type <> MAIN_ITEMS.type) OR (
    I.ITEM = MAIN_ITEMS.item AND I.branch = MAIN_ITEMS.branch AND I.type = MAIN_ITEMS.type 
) 
    ) 
) T 
where T.children > 0; 

输出:

A** Main Box 
A London Single 
A Paris Single 
C* Main Single 
C London Box 
D** Main Box 
D London Single 
D Sydney Single 

我希望这样帮助你。

相关问题