SQL Server 2005 محور على عدد غير معروف من الأعمدة

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعمل مع مجموعة من البيانات التي تبدو شيء مثل التالية.

StudentName  | AssignmentName |  Grade
---------------------------------------
StudentA     | Assignment 1   | 100
StudentA     | Assignment 2   | 80
StudentA     | Total          | 180
StudentB     | Assignment 1   | 100
StudentB     | Assignment 2   | 80
StudentB     | Assignment 3   | 100
StudentB     | Total          | 280

اسم و عدد من المهام الحيوية ، أنا بحاجة للحصول على نتائج simlilar التالية.

Student      | Assignment 1  | Assignment 2  | Assignment 3  | Total
--------------------------------------------------------------------
Student A    | 100           | 80            | null          | 180
Student B    | 100           | 80            | 100           | 280

الآن من الناحية المثالية أود أن فرز عمود استنادا إلى "تاريخ الاستحقاق" التي يمكن إدراجها/المقترنة مع كل مهمة.إجمالي يجب أن يكون في نهاية المطاف إذا كان ذلك ممكنا (يمكن أن تكون محسوبة و إزالتها من الاستعلام إذا كان ذلك ممكنا.)

أنا أعرف كيف نفعل ذلك لمدة 3 المهام باستخدام المحورية مع مجرد تسمية الأعمدة ، تحاول أن تفعل ذلك في دينامية الأزياء التي لم أجد حل جيد حتى الآن.أنا أحاول أن أفعل هذا في SQL Server 2005

تحرير

من الناحية المثالية أود أن تنفيذ هذا دون استخدام SQL ديناميكية, كما أن ضد هذه السياسة.إذا لم يكن من الممكن...ثم سبيل المثال العمل مع SQL ديناميكية العمل.

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

المحلول

أنا أعلم أنك قلت لا الديناميكي SQL, ولكن أنا لا أرى أي طريقة للقيام بذلك في مباشرة SQL.

إذا كنت تحقق من بلدي إجابات على مشاكل مماثلة في الجدول المحوري و سلسلة أعمدة و المحورية في sql server 2005

ديناميكية SQL ليس هناك عرضة الحقن, و ليس هناك أي سبب وجيه لمنع ذلك.احتمال آخر (إذا كانت البيانات المتغيرة نادرا جدا) هو رمز الجيل - بدلا من ديناميكية SQL, ، SQL يتم إنشاء إجراء مخزن على أساس منتظم.

نصائح أخرى

إلى PIVOT هذه البيانات باستخدام sql ديناميكية يمكنك استخدام التعليمات البرمجية التالية في SQL Server 2005+:

إنشاء الجدول:

CREATE TABLE yourtable
    ([StudentName] varchar(8), [AssignmentName] varchar(12), [Grade] int)
;

INSERT INTO yourtable
    ([StudentName], [AssignmentName], [Grade])
VALUES
    ('StudentA', 'Assignment 1', 100),
    ('StudentA', 'Assignment 2', 80),
    ('StudentA', 'Total', 180),
    ('StudentB', 'Assignment 1', 100),
    ('StudentB', 'Assignment 2', 80),
    ('StudentB', 'Assignment 3', 100),
    ('StudentB', 'Total', 280)
;

المحور الحيوي:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(AssignmentName) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT StudentName, ' + @cols + ' from 
             (
                select StudentName, AssignmentName, grade
                from yourtable
            ) x
            pivot 
            (
                min(grade)
                for assignmentname in (' + @cols + ')
            ) p '

execute(@query)

انظر SQL كمان مع Demo

والنتيجة هي:

| STUDENTNAME | ASSIGNMENT 1 | ASSIGNMENT 2 | ASSIGNMENT 3 | TOTAL |
--------------------------------------------------------------------
|    StudentA |          100 |           80 |       (null) |   180 |
|    StudentB |          100 |           80 |          100 |   280 |

الطريقة الوحيدة التي وجدتها للقيام بذلك هو استخدام SQL ديناميكية ووضع عمود التسميات إلى متغير.

يمكنك الاستعلام information_schema للحصول على أسماء الأعمدة وأنواع ، ثم استخدام النتيجة كما فرعي عند بناء مجموعة النتائج.ملاحظة سوف يكون على الأرجح إلى تغيير تسجيل الدخول الوصول قليلا.

هذا هو نفس المحورية في sql server 2005

إذا كانت هذه البيانات للاستهلاك في تقرير هل يمكن استخدام SSRS مصفوفة.فإنه سيتم إنشاء الأعمدة حيوي من مجموعة النتائج.لقد استخدمت عدة مرات - أنه يعمل بشكل جيد جدا بالنسبة ديناميكية جدولي التقارير.

هنا هو مثال جيد w/ sql ديناميكية.http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

SELECT TrnType
INTO #Temp1
FROM
(
    SELECT '[' + CAST(TransactionType AS VARCHAR(4)) + ']' AS TrnType FROM tblPaymentTransactionTypes
) AS tbl1

SELECT * FROM #Temp1

SELECT * FROM
(
    SELECT FirstName + ' ' + LastName AS Patient, TransactionType, ISNULL(PostedAmount, 0) AS PostedAmount
    FROM tblPaymentTransactions
            INNER JOIN emr_PatientDetails ON tblPaymentTransactions.PracticeID = emr_PatientDetails.PracticeId
            INNER JOIN tblPaymentTransactionDetails ON emr_PatientDetails.PatientId = tblPaymentTransactionDetails.PatientID
                        AND tblPaymentTransactions.TransactionID = tblPaymentTransactionDetails.TransactionID
    WHERE emr_PatientDetails.PracticeID = 152
) tbl
PIVOT (SUM(PostedAmount) FOR [TransactionType] IN (SELECT * FROM #Temp1)
) AS tbl4
select studentname,[Assign1],[Assign2],[Assign3],[Total] 
from 
(
 select studentname, assignname, grade from student
)s
pivot(sum(Grade) for assignname IN([Assign1],[Assign2],[Assign3],[Total])) as pvt
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top