SQL Server: ตัวอย่างข้อมูล PIVOTing String


125

พยายามหาตัวอย่าง SQL Server PIVOT แบบง่ายๆ ตัวอย่างส่วนใหญ่ที่ฉันพบเกี่ยวข้องกับการนับหรือการสรุปตัวเลข ฉันแค่ต้องการเปลี่ยนข้อมูลสตริง ตัวอย่างเช่นฉันมีข้อความค้นหาที่ส่งคืนสิ่งต่อไปนี้

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

ฉันต้องการใช้ PIVOT (ถ้าเป็นไปได้) เพื่อให้ได้ผลลัพธ์ดังนี้:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

เป็นไปได้ด้วยฟังก์ชัน PIVOT หรือไม่?


1
ตรวจสอบRow To Column (PIVOT)และColumn To Row (UNPIVOT)
SQLMenace

ลองดูที่ลิงค์นี้: dotnetgalactics.wordpress.com/2009/10/23/…อาจเป็นประโยชน์;)
Pato

คุณสามารถดูลิงก์นี้ได้หากไม่ทราบจำนวนรายการที่แตกต่างกันซึ่งหมายความว่าไม่มีคอลัมน์หลังจากการหมุนเป็นไดนามิก SQL Server Pivot: การแปลงแถวเป็นคอลัมน์ด้วย Dynamic Query
maeenul

คำตอบ:


165

โปรดจำไว้ว่าฟังก์ชันการรวม MAX จะทำงานกับข้อความและตัวเลข แบบสอบถามนี้ต้องการให้สแกนตารางเพียงครั้งเดียว

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 เพื่อน ... คุณเป็นอัจฉริยะจริงๆ ฉันหวังว่าฉันจะได้รู้เรื่องนี้เร็วกว่านี้แทนที่จะต้องเรียนรู้วิธีการ PIVOT!
ashes999

@ Silmaril89 สมมติว่าชื่อคอลัมน์ที่ 2 ที่เป็นปัญหาคือ 'data' และคอลัมน์ที่ 1 คือ 'Action'
Iman

1
มีเหตุผลใดบ้างที่ฉันไม่ควรใช้...ELSE NULL END...แทน...ELSE '' END...?
เดือน

15
เร็วกว่านี้หรือ PIVOT?
Robert Jeppesen

โอ้โหคุณแค่ทำให้ฉันคิด ในหัวของฉันฉันมีความคิดนี้ว่าเซิร์ฟเวอร์ SQL "ควรจะทำอะไร!" แต่คิดว่ามันทำไม่ได้ จากนั้นฉันก็เห็นสิ่งนี้
David Hay

54

การตั้งค่าตาราง:

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

โต๊ะของคุณ: SELECT action, view_edit FROM dbo.tbl

โต๊ะของคุณ

ค้นหาโดยไม่ใช้ 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

ค้นหาโดยใช้ 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

ผลการสืบค้นทั้งสอง:
ใส่คำอธิบายภาพที่นี่


ขอบคุณสำหรับคำตอบที่หายากและชัดเจนนี้ มันแสดงตัวอย่างและชุดข้อมูลที่เป็นผลลัพธ์ทันที
real_yggdrasil

ฉันรู้ว่ามันเก่า แต่นี่เป็นการสาธิตเดือยที่ชัดเจนและดีที่สุดเท่าที่ฉันเคยเห็นมา
Stan Shaw

52

หากคุณต้องการใช้ฟังก์ชัน SQL Server PIVOT โดยเฉพาะสิ่งนี้ควรใช้งานได้โดยสมมติว่าคอลัมน์ดั้งเดิมสองคอลัมน์ของคุณเรียกว่า act และ cmd (ไม่ค่อยสวยเท่าที่ควร)

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

สำหรับตัวอย่างของคุณและคอลัมน์ที่ไม่ซ้ำกันจำนวน จำกัด สิ่งนี้ควรทำ

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


0

ฉันมีสถานการณ์ที่ฉันกำลังแยกวิเคราะห์สตริงและสองตำแหน่งแรกของสตริงที่เป็นปัญหาจะเป็นชื่อฟิลด์ของมาตรฐานการเข้ารหัสการอ้างสิทธิ์ด้านการดูแลสุขภาพ ดังนั้นฉันจะตัดสตริงออกและรับค่าสำหรับ F4, UR และ UQ หรืออะไรก็ได้ สิ่งนี้ยอดเยี่ยมในหนึ่งระเบียนหรือสองสามระเบียนสำหรับผู้ใช้หนึ่งคน แต่เมื่อฉันต้องการดูบันทึกหลายร้อยรายการและค่าสำหรับผู้ใช้ทั้งหมดมันจำเป็นต้องเป็น PIVOT นี่เป็นสิ่งที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งสำหรับการส่งออกบันทึกจำนวนมากไปยัง excel คำขอการรายงานเฉพาะที่ฉันได้รับคือ "ทุกครั้งที่มีคนส่งการอ้างสิทธิ์สำหรับ Benadryl พวกเขาส่งค่าอะไรในฟิลด์ F4, UR และ UQ ฉันมี OUTER APPLY ที่สร้าง ColTitle และฟิลด์ค่าด้านล่าง

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.