خادم قاعدة البيانات:أمثلة على بيانات سلسلة PIVOTing

StackOverflow https://stackoverflow.com/questions/24470

  •  09-06-2019
  •  | 
  •  

سؤال

محاولة العثور على بعض الأمثلة البسيطة لـ SQL Server PIVOT.تتضمن معظم الأمثلة التي وجدتها عد الأرقام أو جمعها.أريد فقط أن أقوم بتدوير بعض بيانات السلسلة.على سبيل المثال، لدي استعلام يعرض ما يلي.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

أرغب في استخدام PIVOT (إن أمكن) للحصول على النتائج كما يلي:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

هل هذا ممكن حتى مع وظيفة PIVOT؟

هل كانت مفيدة؟

المحلول

تذكر أن وظيفة التجميع 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

نصائح أخرى

إذا كنت تريد استخدام وظيفة 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

إعداد الجدول:

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

Your table

الاستعلام بدون استخدام 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

نتيجة كلا الاستعلامين:
enter image description here

من http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/:

SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO

حسنًا، بالنسبة لعينتك وأي عينة تحتوي على عدد محدود من الأعمدة الفريدة، من المفترض أن يؤدي ذلك إلى القيام بذلك.

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

كان لدي موقف حيث كنت أقوم بتحليل السلاسل وسيكون الموضعان الأولان من السلسلة المعنية هما أسماء الحقول لمعيار ترميز مطالبات الرعاية الصحية.لذلك سأقوم بتجريد السلاسل والحصول على قيم F4 وUR وUQ أو غيرها.كان هذا رائعًا بالنسبة لسجل واحد أو بضعة سجلات لمستخدم واحد.ولكن عندما أردت رؤية مئات السجلات والقيم لجميع المستخدمين، كان من الضروري أن تكون PIVOT.كان هذا رائعًا خاصة بالنسبة لتصدير الكثير من السجلات للتفوق.كان طلب الإبلاغ المحدد الذي تلقيته هو "في كل مرة يقدم فيها شخص ما مطالبة بخصوص Benadryl، ما هي القيمة التي قدمها في الحقول F4 وUR وUQ.كان لدي تطبيق خارجي أدى إلى إنشاء ColTitle وحقول القيمة أدناه

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

يمكنك استخدام هذا مع التمحور:

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top