SQL Server 2005 محور على عدد غير معروف من الأعمدة
-
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