2015-08-06 29 views
5

Pivot sütun adlarını çoğaltmak ve sütunlar

ben 2 tablolar olduğunu düşünün açıklamada, tüm değerleri olsun. FormFields, sütun adlarını, döndürülmesi gereken değerlerle ve FilledValues numaralı ikinci tabloyla birlikte sağlanan FormFieldId ile doldurulmuş değerleri olarak saklar.

SORUN

Gördüğünüz gibi FormFields tabloda (NUMUNE bölümünde aşağıda) yinelenen adları, ancak farklı kimlikleri var. Tablolara katıldıktan sonra, FilledValues tablosundaki tüm değerlerin Id'lere değil, sütun adlarına tahsis edilmesi gerekir.

Neye ihtiyacım var, aşağıdaki OUTPUT bölümünde göreceksiniz.

NUMUNE VERİLERİ

FormFields

ID Name GroupId 
1 col1  1 
2 col2  1 
3 col3  1 
4 col1  2 
5 col2  2 
6 col3  2 

FilledValues

ID Name FormFieldId GroupID 
1  a  2   1 
2  b  3   1 
3  c  1   1 
4  d  4   2 
5  e  6   2 
6  f  5   2 

ÇIKIŞ

col1 col2 col3 
c  a  b -- As you see It returning only values for FormFieldId 1 2 3 
        -- d, e, f are lost that because It have duplicate col names, but different id's 
ŞİMDİLİK

SELECT * FROM 
(
    SELECT FF.Name AS NamePiv, 
      FV.Name AS Val1  
    FROM FormFields FF 
    JOIN FilledValues FV ON FF.Id = FV.FormFieldId  
) x 
PIVOT 
(
    MIN(Val1) 
    FOR NamePiv IN ([col1],[col2],[col3]) 
) piv 

SQL FIDDLE

Nasıl birden satırlarla OUTPUT üretebilir ÇIKIŞ

col1 col2 col3 
c  a  b 
e  f  d 

SORGU İSTENİLEN?

cevap

2

Eğer sadece her sütun gruplanmazlar için bir değer döndürmek, böylece veriler toplanıp ediliyor PIVOT kullandığımız için. Alt sorgularınızda, PIVOT'un çoklu satırları döndürmek için benzersiz ve kullanılmakta olan herhangi bir sütununuz yoktur. Bunu yapmak için biraz değere ihtiyacın var. Her "grup" için benzersiz bir değere sahip bir sütununuz varsa, bunu kullanırsınız veya row_number() gibi bir pencere işlevini kullanabilirsiniz. Eğer 2 col1 bir satıra ilişkin 1 ve başka bir satıra ilişkin 2 üretecektir varsa

row_number() her FF.Name anlam için sıralandı sayıda yaratacaktır.Bu alt sorgu dahil edildikten sonra, artık veri toplama yaparken kullanılan farklı bir değere sahip ve birden fazla satır döndürür:

SELECT [col1],[col2],[col3] 
FROM 
(
    SELECT 
    FF.Name AS NamePiv, 
    FV.Name AS Val1, 
    rn = row_number() over(partition by ff.Name order by fv.Id) 
    FROM FormFields FF 
    JOIN FilledValues FV ON FF.Id = FV.FormFieldId   
) x 
PIVOT 
(
    MIN(Val1) 
    FOR NamePiv IN ([col1],[col2],[col3]) 
) piv; 

SQL Fiddle with Demo bakınız. Çıktı: Ben koşullu toplama ile bunu eğimli olacak

| col1 | col2 | col3 | 
|------|------|------| 
| c | a | b | 
| e | f | d | 
+0

Cevabınız için teşekkür ederiz, bazı 'Gruplar' kısmında küçük bir problem var tüm FormField değerleri boş (hiç değer yok), bu satırları seçmekten nasıl kaçınamıyorum? İşte SQL Fiddle, tüm boş değerlerle GroupId 3 ekledi. Bu satır seçilmemelidir: http://sqlfiddle.com/#!3/2961a/1 –

+0

@ StanislovasKalašnikovas Boşlukları filtrelemek için bir yan tümce kullanın: FilledValues ​​- http://sqlfiddle.com/#!3/2961a/3 – Taryn

2

Sadece sorunu çözecektir Pivot source sorguda GroupId ekleyerek

SELECT * FROM (
SELECT FF.Name AS NamePiv, 
     FV.Name AS Val1, 
     ff.groupid 
FROM FormFields FF 
JOIN FilledValues FV ON FF.Id = FV.FormFieldId  
) x 
PIVOT 
(
MIN(Val1) 
FOR NamePiv IN ([col1],[col2],[col3]) 
) piv 

SQLFIDDLE DEMO

+0

Cevabınız için teşekkür ederiz, bazı 'Gruplar' kısmında küçük bir sorun var, tüm FormField değerleri boş (hiç değer yok), bu satırları seçmekten nasıl kaçınamıyorum? İşte SQL Fiddle, tüm boş değerlerle GroupId 3 ekledi. Bu satır seçilmemelidir: http://sqlfiddle.com/#!3/2961a/1 –

+0

@ StanislovasKalašnikovas - Basit filtre bu sorunu düzeltmelidir http://sqlfiddle.com/#!3/2961a/2 veya based gereksinimi üzerine süzgeci uzatın –

0

: kuralın bir sütuna bir değer atamak için ne belirsizdir

select max(case when formfieldid % 3 = 1 then name end) as col1, 
     max(case when formfieldid % 3 = 2 then name end) as col2, 
     max(case when formfieldid % 3 = 0 then name end) as col3 
from FilledValues 
group by GroupID; 

. Bu, giriş verileriniz için çalışan kalanını kullanır.

İlgili konular