sql

2009-06-09 12 views
23

tüm sütun değerlerini doldurun Tüm sütun değerlerini bir sql sorgusundan döndürülen farklı satırlardan bir değere nasıl aktarılır? sql

 
FOOCONCAT 
----- 
RES1RES2RES3 

sql bunu yapmanın herhangi bir yolu var:

 
FOO 
------ 
RES1 

RES2 

RES3 

şimdi aşağıdaki gibi bir sonuç istiyorum:

bir sorgu döndürür: Bu bir örnektir? kolonlar zaten döküm gerekmez asar ise

+0

kullandığınız sunucu? Bunu yapmak için genel bir SQL yolu olduğundan şüphe duyuyorum ama kesinlikle uygulamaya özel yöntemler var. –

+1

Oracle kullanıyorum. Bunu kehanette yapmak için kolay bir yol olmadığından şaşıyorum. – paweloque

cevap

0
select cast(res1 as varchar)+cast(res2 as varchar)+cast(res3 as varchar) as fooconcat from foo 

, sadece yapabilirsiniz:

birden çok satırdan veriler için
select res1 + res2 + res3 as fooconcat from foo 

, PIVOT kullanın.

+0

ve bunu keyfi sayıda değer için nasıl yapıyorsunuz? – paweloque

+0

res1, res2 ve res3 sütun değil değerler. Sütun 'foo'. – paweloque

+0

Maalesef, bunu yanıtladığımda verileriniz tek bir satırda biçimlendirildi, bu nedenle soru farklı bir şekilde göründü. – RedFilter

40

SQL Server olarak:

SELECT col1 AS [text()] 
FROM foo 
FOR XML PATH ('') 

MySQL olarak:

SELECT GROUP_CONCAT(col1 SEPARATOR '') 
FROM foo 

PostgreSQL olarak:

SELECT array_to_string 
     (
     ARRAY 
     (
     SELECT col1 
     FROM foo 
     ), '' 
     ) 

Oracle olarak:

SELECT * 
FROM (
     SELECT col1, ROW_NUMBER() OVER(ORDER BY 1) AS rn 
     FROM foo 
     MODEL 
     DIMENSION BY 
       (rn) 
     MEASURES 
       (col1, col1 AS group_concat, 0 AS mark) 
     RULES UPDATE (
       group_concat[rn > 1] = group_concat[CV() - 1] || col1[CV()], 
       mark[ANY] = PRESENTV(mark[CV() + 1], 0, 1) 
       ) 
     ) 
WHERE mark = 1 
+1

bir çözüm gibi görünüyor, ama bu kehanette nasıl görünecek? – paweloque

+1

@lewap: Sabır! – Quassnoi

+0

SQL Server'da bu harika bir numara, seçim yapmak için şunu değiştireceğim: SELECT REPLACE (REPLACE (col1, '', ''), '', '') – RedFilter

0

Dizeleri bitiştirme ...

Oracle ve DB2 sen CONCAT fonksiyonunu kullanabilirsiniz ... (Eğer bu yüzden buraya sorunuzu hangi sürümünün söz havnt) kullanıyorsanız veritabanına bağlıdır CONCAT(string, string)

buna TEXTCAT(string, string) olan PostgreSQL içinde CONCAT(string, string... n_string)

Son olarak ise MySQL string1 + string2 + string3

sen '+' operatörünü kullanabilirsiniz

SQL Server ... ...

... Bu kitaptan çıkmıştım, O'Reilly'deki SQL Pocket Guide'daki masaüstümde oturmuş ... kontrol et!

:)

+1

Bunlar sadece aynı satırdaki dizelerle gerçekten çalışır. –

+0

Sana RES ... Böyle bir şey yapmak @Text = @Text + seçip olurdu, ne demek istediğini biliyorum, veya sütunları bitiştirmek için @Text = CONCAT (@Text, RES) vb seçin. –

3

birden değere sahip bir sütun olduğunu varsayarsak, bu yaklaşım (ı diğer sistemler için konuşamıyor) MS SQL Server için çalışır.

declare @result varchar(max) 
set @result = '' 

select @result = @result + RES 
from (query goes here) 
0

Size aradığınızı olmayabilir, ama böyle yapılar ile geçmişte iyi yaşamadık:

SELECT  MAX(DECODE(fookey, 1, foo, NULL)) 
     || MAX(DECODE(fookey, 2, foo, NULL)) 
     || MAX(DECODE(fookey, 3, foo, NULL)) 
     || MAX(DECODE(fookey, 4, foo, NULL)) 
     , groupingvalue 
    FROM mytable 
GROUP BY groupingvalue; 

Bu platform bağımsız olduğunu ve iyi zaman sizi çalışır foo için keyfi, ancak sınırlı sayıda değerlere sahipler ve diğer bazı anahtar değerlere dayanıyorlar.Örneğin, bir fatura tablonuz varsa ve faturadaki tek satırdaki tüm satır zamanlarını tek bir satırda görmek istiyorsanız, birleştirilmiş ve 5 satırlık bir üst sınırınız varsa, şu şekilde görünecektir:

SELECT  MAX(DECODE(lineno, 1, foo, NULL)) 
     || ', ' 
     || MAX(DECODE(lineno, 2, foo, NULL)) 
     || ', ' 
     || MAX(DECODE(lineno, 3, foo, NULL)) 
     || ', ' 
     || MAX(DECODE(lineno, 4, foo, NULL)) 
     || ', ' 
     || MAX(DECODE(lineno, 5, foo, NULL)) 
     , invoiceid 
    FROM lineitem 
GROUP BY invoiceid; 
3

mySQL yol: Burada

select group_concat(somecolumn separator '') from sometable 
+0

ı gerekli ama bu sana bazen – jsh

1

Aradığınız cevabı; CONNECT BY işleminde çözümün olduğunu hissettim, daha önce SYS_CONNECT_BY_PATH psödokolonunu kullanmamıştım (bu, bir ağaçtaki düğümün tam yolunu gösterir, düğüm isimlerini bir "/" ile ayırır).

myKey foo 
-------- ---------- 
group 1 apple 
group 1 orange 
group 1 pear 
group 2 ape 
group 2 bear 
group 2 kitten 

bunu bir ağaç şeması sanki verileri tedavi ve gibi yapabiliriz: örneğin, "foo" değerler daha önce bir sütun "MyKey" göre gruplandırılmış bir tablo birden fazla satır vardır senin seti, olduğu varsayıldığında Her grubun değerleri bir daldan aşağı giden düğümleri temsil eder. Bu durumda, bunu yapmak istiyorum:

Tabii
SELECT myKey 
     , SUBSTR(MAX(REPLACE(SYS_CONNECT_BY_PATH(foo, '/') 
          ,'/' 
          ,' ' 
          ) 
        ) 
       ,2 
       ) FooConcat 
    FROM (SELECT MyKey 
       , Foo 
       , row_number() OVER (Partition by myKey order by myKey) NodeDepth 
      FROM MyTable 
     ) 
    START WITH NodeDepth = 1 
CONNECT BY PRIOR myKey = myKey 
    AND PRIOR NodeDepth = NodeDepth -1 
GROUP BY myKey 
; 

, birleştirilmiş değerlerinin sırası rastgele olacaktır; masanızda, artan ve bitişik olan bir sıralama alanı olarak kullanabileceğiniz başka bir sütun ("bar") varsa, alt kümeyle (yalnızca hayali bir derinliği ağacın içine koymak için var olan) dağıtabilirsiniz ve tabloyu doğrudan kullanabilirsiniz. NodeDepth öğesinin çubukla değiştirilmesi.

8

Quassnoi'nin Oracle çözümü oldukça etkileyici, ancak MODEL sihrinden çok SYS_CONNECT_BY_PATH() kullanan foundsimpler.

SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(foo, '/')), '/', '') conc 
FROM (
    SELECT T_FOO.*, ROW_NUMBER() OVER (ORDER BY FOO) R FROM T_FOO 
) 
START WITH r=1 
CONNECT BY PRIOR r = r-1; 
+0

Güzel, bunu kullanmaktan başardı gerçekten yararlı olacak söyleyebilir oldukça ne olmadığı ortaya çıktı. Aferin. – contactmatt

-2

seçin ([col1] + ' '+ [col2] +', '+ [col3] +',' + [Süt4]) [MyCol] [Tablo]

+3

hedef satır, değil sütunlar uç uca ekleyerek –

1

kaynaktan olarak Düzenleme: Sürüm 8.4.0 CUBRID, MySQL ile 90% compatibility sağlar.

CREATE TABLE t(i int); 
INSERT INTO t VALUES (4),(2),(3),(6),(1),(5); 

SELECT GROUP_CONCAT(i*2+1 ORDER BY 1 SEPARATOR '') FROM t; 

group_concat(i*2+1 order by 1 separator '') 
====================== 
    '35791113' 

Oldukça güçlü, değil mi: Böylece, MySQL gibi benzer sözdizimi vardır GROUP_CONCAT destekler? Aşağıda CUBRID'de doğal olarak desteklenen bir alternative solution bulunmaktadır.

SELECT MAX(SYS_CONNECT_BY_PATH(s_name, '')) AS conc_s_name 
FROM (
    SELECT ROWNUM AS r, s_name FROM code 
) AS res 
START WITH r = 1 
CONNECT BY PRIOR r = r - 1; 

Bu @devio tarafından sağlanan CUBRID farklı satır sütun değerleri bitiştirme bu şekilde Oracle'ın şekilde neredeyse aynı olacak şekilde ilginç. CUBRID'de biraz daha kolay görünüyor.

0

SQL Server 2008 R2: Eğer

declare @ColumnNameList VARCHAR(MAX) 


SELECT @ColumnNameList = COALESCE(@ColumnNameList +',' ,'') + ColumnName 
        FROM 
         <<table name>> 

select @ColumnNameList