2013-10-16 29 views
0

你能幫我解決這個SQL查詢嗎?oracle相同的行多列組由

我有兩個表如下

表A

ID  NUM 
------------ 
AA  123 
BB  234 
CC  345 
DD  567 
EE  678 
FF  789 
GG  890 

表B

ID  SER 
----------- 
AA  MNP 
BB  MNP 
CC  MN 
DD  PQR 
EE  PQR 
FF  XYZ 
GG  XYZ 

我想結果顯示如下

表C

SER  NUM  NUM2 
----------------------- 
MNP  123  234 
MN   345  NULL 
PQR  123  234 
XYZ  123  234 

我試過不同的查詢。但是,無法獲得如何獲得相同列結果的線索。

任何幫助將不勝感激。

+0

這是非常基本的SQL知識。 –

+0

你說你「嘗試過不同的查詢。」哪一個? –

+0

@Juergen:我知道這是基本的SQL,但沒有得到一個線索如何解決這個問題。 – user2885428

回答

0

Read this

試試這個:

WITH TABLEA 
    AS (SELECT 
      'AA' AS ID, 
      123 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'BB' AS ID, 
      234 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'CC' AS ID, 
      345 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'DD' AS ID, 
      567 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'EE' AS ID, 
      678 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'FF' AS ID, 
      789 AS NUM 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'GG' AS ID, 
      890 AS NUM 
     FROM 
      DUAL), 
    TABLEB 
    AS (SELECT 
      'AA' AS ID, 
      'MNP' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'BB' AS ID, 
      'MNP' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'CC' AS ID, 
      'MN' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'DD' AS ID, 
      'PQR' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'EE' AS ID, 
      'PQR' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'FF' AS ID, 
      'XYZ' AS SER 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'GG' AS ID, 
      'XYZ' AS SER 
     FROM 
      DUAL) 
SELECT 
     TABLEB.SER, 
     RTRIM (XMLAGG (XMLELEMENT (E, 
           TABLEA.NUM 
           || ',')).EXTRACT ('//text()'), 
      ',') 
      NUM 
FROM 
     TABLEA, 
     TABLEB 
WHERE 
     TABLEA.ID = TABLEB.ID 
GROUP BY 
     TABLEB.SER 
ORDER BY 
     TABLEB.SER; 
+0

謝謝。但是查詢可能適用於較小的表。很多謝謝 – user2885428

+0

發佈確切的場景你讀過我給的鏈接嗎? – SriniV

+0

是的。除了一個約束,它將所​​有行合併成一列。非常有幫助。但是,如果你看到我上面的問題,我希望它能夠 – user2885428

0

一個快速,如果我得到你想要做什麼:

select Y.SER, max(Y.NUM) NUM, max(Y.NUM2) NUM2 
from 
(
    select B.SER, decode(X.lvl, 1, X.NUM, null) NUM, decode(X.lvl, 2, X.NUM, null) NUM2 
    from 
    (
    select B.SER, B.ID, A.NUM, rank() over (partition by B.SER order by A.ID) lvl 
    from B, A 
    where A.ID (+) = B.ID 
) X, B 
    where B.SER = X.SER 
    and B.ID = X.ID 
) Y 
group by Y.SER 
; 

這給:

MNP 123 234 
MN 345 
PQR 567 678 
XYZ 789 890 

根據在O的版本上您使用的是racle,您可以使用pivot子句保存一個子查詢(但它的使用有點複雜)。

+0

非常感謝你靈光不同列。您的幫助深表感謝 – user2885428

1

你也可以試試這個:

select ser, 
     max(decode(rank, 1, num, null)) num, 
     max(decode(rank, 2, num, null)) num2 
from (
    select SER, num, rank() over(partition by SER order by num) rank 
    from tablea a 
    inner join tableb b on a.id = b.id 
    order by ser, rank() over(partition by SER order by num) 
) 
group by ser 

這裏demo in SQLFiddle

+0

非常感謝你Mucio.It是非常有益的。 – user2885428

+0

沒問題,也許將其標記爲正確的答案:) – mucio

0

故意添加另一個答案:From here

三種可能的選擇在Oracle 11g中移調

  1. 解碼選項

a。 b。使用SUM和DECODE作爲新列,如果你想轉置和總結

b。如果要轉,不總結使用MAX和解碼新列

  • 使用PIVOT

  • 使用帶和SUB選擇受戈登

    說:
  • 要使用數據透視表,在您的代碼中不可能,因爲您的初始數據集已經被旋轉了。