2013-10-08 21 views
9

SSIS'da, satırları sütunlara dönüştüren Pivot dönüşümü adı verilen bir görev var, ancak aynı görevi t-sql kullanarak sql sunucusunda nasıl yaparsınız?T-sql'yi kullanarak Pivot dönüşümü

bu Örneğim tablodur

location product qty 
----------------------- 
delhi  PEPSI 100 
GURGAON CAKE 200 
NOIDA  APPLE 150 
delhi  cake 250 

çok ssis aracını kullanarak döner anahtar olarak setkey ve ürün olarak bir yer üzerinde dönecek transformasyondan sonra o/p

location pepsi cake apple 
delhi  100 null null 
GURGAON null 200 null 
NOIDA  null null 150 
delhi  null 250 null 

cevap

9

Kullanıcıyı PIVOT Tablo operatörü olur Bu gibi:

SELECT * 
FROM tablename 
PIVOT 
(
    MAX(qty) 
    FOR product IN([pepsi], [cake], [apple]) 
) as p; 
    Eğer toplamı kullanımını SUM veya onun yerine başka bir toplama işlevi almak istiyorsanız

    Not.

  • El ile döndürmek yerine bunu dinamik olarak yapmak istiyorsanız, el ile döndürülen sütunun değerlerini yazmanız gerekir, bunun için dinamik sql kullanmanız gerekir. Bu gibi

:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(product) 
         FROM tablename 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 'SELECT * 
FROM tablename 
PIVOT 
(
    MAX(qty) 
    FOR product IN(' + @cols + ')) AS p;'; 

execute(@query); 
+2

+1 dinamik sql örneği için – Dan

8

Pivot isteği üç mantıksal işlem aşamalarını, ilgili elemanların her biri şunları içerir: fazgruplandırma

  1. Yayılma fazı
  2. ve ilişkili bir toplama öğesi ve toplama işlevi bulunan bir birleştirme aşaması.

Yani sizin durumda şartı ile bu aşamaları haritalama:

  1. Gruplama ‘Location’
  2. yayma üzerinde yapılması gereken gibi nihai sütun adları ile ‘Product’ sütun değerlerine dayalı yapılmalıdır: 'Pepsi ', 'Kek', 'Elma'.

    SELECT ... 
    FROM <source_table_or_table_expression> 
    PIVOT(<agg_func>(<aggregation_element>) 
    FOR <spreading_element> 
    IN (<list_of_target_columns>)) AS <result_table_alias> 
    

    Sorgunuzda olur:

    select location ,[PEPSI], [CAKE],[APPLE] 
    from table1 
    pivot (sum(qty) 
         for product 
         in ([PEPSI], [CAKE],[APPLE])) AS T 
    

  3. ‘Qty’ değerleri gruplama için değerleri kesişen ve yayma elemanları

standart Pivot açıklamada bu değerleri koymak üretmek için toplanır edilmelidir PIVOT operatörü ile gruplama elemanlarını açıkça belirtmediğinizi, n sorguda GROUP BY için eed. PIVOT operatörü, gruplarını, yayma öğesi veya toplama öğesi olarak belirtilmemiş olan kaynak tablodan (veya tablo ifadesinden) tüm nitelikler olarak örtük olarak belirtir. Bu nedenle, PIVOT operatörü için kaynak tablonun, gruplama, yayma ve toplama öğeleri dışında hiçbir özniteliğe sahip olmamasını sağlamalısınız, böylece yayma ve toplama öğelerini belirledikten sonra, geriye kalan tek özellik, gruplandırma öğeleri olarak amaçladığınızlardır. Bunu, PIVOT operatörünü doğrudan orijinal tabloya uygulayarak değil, sadece dönme elemanlarını temsil eden öznitelikleri ve başkalarını içermeyen bir tablo ifadesine uygulayarak elde edersiniz.

select location ,[PEPSI], [CAKE],[APPLE] 
from (select location,product,qty 
     from table1) as SourceTable 
     pivot (sum(qty) 
      for product 
      in ([PEPSI], [CAKE],[APPLE])) AS T 

Umut bu iyi anlaşılması Pivot operatörü olur !!

DÜZENLEME: Katma UNPIVOT operatör konsepti:

gibi Oynar, Unpivoting da 3 mantıksal aşamaları içerir: ortadan kaldırmak

  1. üreten kopya
  2. ayıklanıyor elemanları
  3. alakasız kesişen kayıtları

Standart Unpivot ifadesinde bu değerleri koymak :

SELECT ... 
FROM <source_table_or_table_expression> 
UNPIVOT(<target_col_to_hold_source_col_values> 
FOR <target_col_to_hold_source_col_names> IN(<list_of_source_columns>)) AS 
<result_table_alias>; 

sizin durumunuzda şartı ile bu aşamaları eşleme: Sütun ... İstediğiniz [Pepsi], [Cake],[Apple] 100.250 yani değerleri tutmak için:

  1. <target_col_to_hold_source_col_values> = kaynak sütun yapacak sütunun adı yani değerleri tek bir sütunun olması: Qty
  2. <target_col_to_hold_source_col_names> = Kaynak sütun adlarını tutacak sütunun adı yani: sütun adlarını tutmak için [Pepsi], [Cake],[Apple] sütun adlarını tek bir sütuna sahip olmak istediğinizde s: Eğer ilgilenen kaynak tablodaki sütunların product
  3. <list_of_source_columns> = isimleri yani: [Pepsi], [Cake],[Apple]

Sorgunuzda olur: Bir Pivot açıklamada yukarıdan sonuçları eklemiş

SELECT location,product,qty 
FROM #temp 
UNPIVOT(qty 
     FOR product 
     IN([Pepsi],[Cake],[Apple])) AS U; 

geçici tablo #temp.

Dikkat edilmesi gereken önemli nokta şudur: Özetlenmiş bir tablonun devre dışı bırakılması, orijinal tabloyu bir araya getirme nedeniyle ayrıntılı bilgi kaybında döndürme sonucu olarak geri getiremez.

+1

Pivot üzerinde inanılmaz derecede iyi bir yazı, keşke size daha fazla + 1s verebilseydim! – ConstantineK