خادم قاعدة البيانات:تحويل الصفوف إلى أعمدة

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

  •  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 ...

ويمكنك أن تفعل ذلك مع OLAP . هنا هو حلقة أخرى إلى وثائق MSDN على الموضوع .

ومع OLAP، يمكنك إنشاء مكعب مع المعلومات التي لديك، مع تخطيط التي تحتاج إليها.

إذا كنت لا تريد أن تذهب بهذه الطريقة، سيكون لديك لإنشاء الجداول الموجزة مع .NET، جافا، TransacSQL، أو لغتك المفضلة لمعالجة البيانات سيكلسرفير.

لتبديل الأعمدة بسهولة إلى صفوف بأسمائها، يجب عليك استخدام XML.لقد تم وصف ذلك في مدونتي بمثال: وصلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top