it-swarm.dev

إضافة صف ملخص مع المجاميع

أعلم أن هذا يبدو مجنونًا وربما لا ينبغي القيام به بهذه الطريقة ولكني أحتاج إلى شيء مثل هذا - لدي سجلات من SELECT [Type], [Total Sales] From Before

أريد إضافة صف إضافي في النهاية لإظهار SUM في نهاية الجدول (بعد). هل يمكن القيام بذلك؟

enter image description here

50
user2103670

إذا كنت تستخدم SQL Server 2008 أو إصدار أحدث ، فيمكنك استخدام ROLLUP() GROUP BY وظيفة:

SELECT
  Type = ISNULL(Type, 'Total'),
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;

يفترض هذا أن _ Type لا يمكن أن يحتوي العمود على NULLs وبالتالي فإن NULL في هذا الاستعلام سيشير إلى صف مجموعة التحديثات ، الصف مع الإجمالي الكلي. ومع ذلك ، إذا كان يمكن أن يحتوي العمود Type على القيم الخالية الخاصة به ، فسيكون النوع الأنسب من المحاسبة للصف الكلي في إجابة @ Declan_K ، أي باستخدام GROUPING()) وظيفة:

SELECT
  Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END,
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;
50
Andriy M

هذا هو بناء جملة التجميع/التراكم الأقوى الذي تريد استخدامه في SQL Server 2008+. مفيد دائمًا في تحديد الإصدار الذي تستخدمه حتى لا نضطر إلى التخمين.

SELECT 
  [Type] = COALESCE([Type], 'Total'), 
  [Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());

كتب كريج فريدمان منشور مدونة رائع يقدم GROUPING SETS .

18
Aaron Bertrand

حاول استخدام union all على النحو التالي

SELECT [Type], [Total Sales] From Before
union all
SELECT 'Total', Sum([Total Sales]) From Before

إذا كان لديك مشكلة في الطلب ، ف --- i-one اقترح تجربة هذا:

select [Type], [Total Sales] 
from (SELECT [Type], [Total Sales], 0 [Key] 
      From Before 
      union all 
      SELECT 'Total', Sum([Total Sales]), 1 From Before) sq 
order by [Key], Type
15
Parado

يمكنك استخدام مجموعة التحديثات المشغل

SELECT  CASE 
            WHEN (GROUPING([Type]) = 1) THEN 'Total'
            ELSE [Type] END AS [TYPE]
        ,SUM([Total Sales]) as Total_Sales
From    Before
GROUP BY
        [Type] WITH ROLLUP
12
Declan_K