خادم قاعدة البيانات:تحويل الصفوف إلى أعمدة
-
03-07-2019 - |
سؤال
لدي جدول مع الأعمدة sales(int)
, month(int)
.أريد استرداد مبلغ المبيعات الموافق لكل شهر.أحتاج إلى إخراج على شكل 12 عمودًا يتوافق مع كل شهر حيث سيكون هناك سجل واحد يحتوي على المبيعات لكل عمود (شهر).
المحلول
ويجب أن نلقي نظرة على PIVOT للحصول على تبديل الصفوف مع الأعمدة . هذا يمنع العبارة حدد لكل شهر. شيء من هذا القبيل:
DECLARE @salesTable TABLE
(
[month] INT,
sales INT
)
-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)
SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
SELECT [month], sales
FROM @salesTable
) AS SourceTable
PIVOT
(
SUM(sales)
FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable
نصائح أخرى
وليست جميلة ... ولكن هذا يعمل بشكل جيد
SELECT
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]
إليك طريقة بديلة لكتابة محور التي تمنحك المزيد من السيطرة قليلا (وخاصة خلال أسماء الأعمدة). كما أنه من الأسهل قليلا لتوليد SQL الديناميكي ل.
وانها مماثلة لإجابة روبن، ولكن لديه ميزة فقط ضرب الطاولة مرة واحدة:
select
Sales1 = sum( case when Month = 1 then Sales end )
, Sales2 = sum( case when Month = 2 then Sales end )
, Sales3 = sum( case when Month = 3 then Sales end )
-- etc..
from SalesTable;
وفعلت بعض التحقيق، ويبدو أن المشغل محور جديد هو مجرد السكر بناء الجملة لهذا النوع من الاستعلام. خطط الاستعلام في نهاية المطاف النظر متطابقة.
وومثيرة للاهتمام جانبا، ومشغل UNPIVOT ويبدو أيضا أن يكون مجرد السكر بناء الجملة. على سبيل المثال:
إذا كان لديك جدول مثل:
Create Table Sales ( JanSales int, FebSales int, MarchSales int...)
ويمكنك كتابة:
select unpivoted.monthName, unpivoted.sales
from Sales s
outer apply (
select 'Jan', JanSales union all
select 'Feb', FebSales union all
select 'March', MarchSales
) unpivoted( monthName, sales );
والحصول على البيانات unpivoted ...
لتبديل الأعمدة بسهولة إلى صفوف بأسمائها، يجب عليك استخدام XML.لقد تم وصف ذلك في مدونتي بمثال: وصلة