SQL Server: PIVOTing String verileri örnekleri


125

Bazı basit SQL Server PIVOT örneklerini bulmaya çalışıyorum. Bulduğum örneklerin çoğu sayıları saymayı veya toplamayı içerir. Sadece bazı dize verilerini özetlemek istiyorum. Örneğin, aşağıdakileri döndüren bir sorgum var.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Sonuçları şöyle yapmak için (mümkünse) PIVOT kullanmak istiyorum:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

PIVOT işlevi ile bu mümkün mü?



Şu bağlantıya bir göz atın: dotnetgalactics.wordpress.com/2009/10/23/… Yardımcı olabilir;)
Pato

Bu bağlantıyı, farklı öğelerin sayısı bilinmiyorsa, yani özetlemeden sonra hiçbir sütun dinamik değilse görebilirsiniz. SQL Server Pivot: Dinamik Sorgu ile Satırları Sütunlara Dönüştürme
maeenul

Yanıtlar:


165

MAX toplama işlevinin sayılar kadar metin üzerinde de çalışacağını unutmayın. Bu sorgu, tablonun yalnızca bir kez taranmasını gerektirecektir.

SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action

+1 Dostum ... cidden bir dahisin. Keşke bunu nasıl PIVOT yapacağımı öğrenmek yerine daha önce bilseydim!
ashes999

@ Silmaril89, söz konusu 2. sütun adının 'veri' ve 1. sütunun 'Eylem' olduğunu varsayalım
Iman

1
...ELSE NULL END...Bunun yerine kullanmamam için herhangi bir sebep var mı ...ELSE '' END...?
mo.

15
Hangisi daha hızlı, bu mu yoksa PIVOT mu?
Robert Jeppesen

Whoah, aklımı başımdan aldın. Kafamın arkasında, SQL sunucusunun "lanet olsun yeter!" Diye düşündüğüm bir fikir vardı, ama yapılamayacağını düşündüm. Sonra bunu gördüm.
David Hay

54

Tablo kurulumu:

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

Senin masan: SELECT action, view_edit FROM dbo.tbl

Senin masan

PIVOT kullanmadan sorgulama:

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

PIVOT kullanarak sorgulama:

SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

Her iki sorgu sonucu:
görüntü açıklamasını buraya girin


Bu nadir, net cevap için teşekkürler. tam olarak bir örneği ve sonuçta ortaya çıkan veri kümelerini gösterir
real_yggdrasil

Bunun eski olduğunu biliyorum, ancak bu gördüğüm en net, en iyi resimli pivot gösterimi.
Stan Shaw

52

Özellikle SQL Server PIVOT işlevini kullanmak istiyorsanız, iki orijinal sütununuzun act ve cmd olarak adlandırıldığını varsayarak bu çalışmalıdır. (Yine de bakmak o kadar güzel değil.)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt


6

Peki, örneğiniz ve sınırlı sayıda benzersiz sütuna sahip olanlar için bunu yapmalı.

select 
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1

5
With pivot_data as
(
select 
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;

0

Dizeleri ayrıştırdığım bir durum yaşadım ve söz konusu dizenin ilk iki konumu bir sağlık hizmeti talepleri kodlama standardının alan adları olacaktı. Bu yüzden dizeleri çıkarırdım ve F4, UR ve UQ ya da ne için değerleri alırdım. Bu, bir kullanıcı için bir veya birkaç kayıt için harikaydı. Ancak yüzlerce kaydı ve tüm kullanıcılar için değerleri görmek istediğimde PIVOT olması gerekiyordu. Bu, özellikle çok sayıda kaydı mükemmele aktarmak için harikaydı. Aldığım spesifik raporlama talebi, "birisi Benadryl için her talepte bulunduğunda, F4, UR ve UQ alanlarında hangi değeri gönderdiler. ColTitle'ı ve aşağıdaki değer alanlarını oluşturan bir DIŞ UYGULAMA vardı

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.