SQL Server: Contoh data PIVOTing String

125

Mencoba menemukan beberapa contoh SQL Server PIVOT sederhana. Sebagian besar contoh yang saya temukan melibatkan penghitungan atau penjumlahan angka. Saya hanya ingin melakukan pivot pada beberapa data string. Misalnya, saya memiliki kueri yang mengembalikan yang berikut ini.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Saya ingin menggunakan PIVOT (jika mungkin) untuk membuat hasil seperti ini:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Apakah ini mungkin dengan fungsionalitas PIVOT?

Tim Cochran
sumber
Lihatlah tautan ini: dotnetgalactics.wordpress.com/2009/10/23/… Mungkin berguna;)
Pato
Anda dapat melihat tautan ini jika jumlah item berbeda tidak diketahui, artinya tidak ada kolom setelah pivot dinamis. Pivot SQL Server: Mengonversi Baris ke Kolom dengan Kueri Dinamis
maeenul

Jawaban:

165

Ingatlah bahwa fungsi agregat MAX akan berfungsi pada teks serta angka. Kueri ini hanya akan meminta tabel dipindai satu kali.

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
John Hubert
sumber
+1 Bung ... Anda benar-benar jenius. Saya berharap saya bisa mengetahui ini lebih cepat, daripada harus belajar cara PIVOT!
ashes999
@ Silmaril89 menganggap bahwa nama kolom ke-2 yang dimaksud adalah 'data' dan kolom ke-1 adalah 'Tindakan'
Iman
1
Apakah ada alasan mengapa saya tidak boleh menggunakan ...ELSE NULL END...daripada ...ELSE '' END...?
mo.
15
Mana yang lebih cepat, ini atau PIVOT?
Robert Jeppesen
Whoah, kamu baru saja meniup pikiranku. Di belakang kepala saya, saya memiliki gagasan tentang apa yang saya pikir SQL server "harus melakukan sialan!", Tetapi saya pikir itu tidak bisa dilakukan. Lalu, saya melihat ini.
David Hay
54

Pengaturan meja:

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');

Meja Anda: SELECT action, view_edit FROM dbo.tbl

Meja Anda

Kueri tanpa menggunakan PIVOT:

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

Query menggunakan PIVOT:

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

Kedua kueri tersebut menghasilkan:
masukkan deskripsi gambar di sini

mxasim.dll
sumber
Terima kasih atas jawaban yang jarang dan jelas ini. itu segera menunjukkan contoh dan dataset yang dihasilkan
real_yggdrasil
Saya tahu ini sudah tua, tapi ini adalah demonstrasi poros paling jelas dan bergambar terbaik yang pernah saya lihat.
Stan Shaw
52

Jika Anda secara khusus ingin menggunakan fungsi SQL Server PIVOT, maka ini akan berfungsi, dengan asumsi dua kolom asli Anda disebut act dan cmd. (Tapi tidak terlalu cantik untuk dilihat.)

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
Miles D
sumber
6

Nah, untuk sampel Anda dan yang memiliki jumlah kolom unik terbatas, ini harus dilakukan.

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
vzczc
sumber
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;
Vishwanath Dalvi
sumber
0

Saya mengalami situasi di mana saya mengurai string dan dua posisi pertama dari string yang dimaksud adalah nama bidang standar pengkodean klaim perawatan kesehatan. Jadi saya akan menghapus string dan mendapatkan nilai untuk F4, UR dan UQ atau yang lainnya. Ini bagus pada satu catatan atau beberapa catatan untuk satu pengguna. Tetapi ketika saya ingin melihat ratusan catatan dan nilai untuk semua pengguna, itu harus PIVOT. Ini luar biasa terutama untuk mengekspor banyak rekaman agar unggul. Permintaan pelaporan khusus yang saya terima adalah "setiap kali seseorang mengajukan klaim untuk Benadryl, nilai apa yang mereka kirimkan di bidang F4, UR, dan UQ. Saya memiliki OUTER APPLY yang membuat ColTitle dan bidang nilai di bawahnya

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
1994 Nerd
sumber