【问题标题】:How to add a summary row at bottom of table如何在表格底部添加摘要行
【发布时间】:2022-01-12 19:12:35
【问题描述】:

我想要一个显示刷新日期的摘要行,Naics 代码列中的空白,行业列中的“总计”标题,加权平均持续时间列的加权平均值以及剩余每列的总和。

我曾尝试使用 UNION ALL,但一直遇到问题。

SELECT DISTINCT 
    GETDATE() AS 'RefreshDate',
    NaicsID AS 'NAICS Code',
    NaicsName AS 'Industry',
    FORMAT(SUM(RemainingTerm * BaseRent)/SUM(BaseRent), 'N1') AS 'Weighted Average Duration',
    FORMAT(SUM(BaseRent), 'C0') AS 'Occupied Contract Rent',
    FORMAT(SUM(BaseRent)/(SELECT SUM(BaseRent) 
                          FROM dbo.data 
                          WHERE NextSpaceLeaseID IS NULL), 'P1') AS '% of Commercial Total Rent',
    FORMAT(SUM(SpaceLeaseArea), 'N0') AS 'Occupied SF',
    FORMAT(SUM(SpaceLeaseArea)/(SELECT SUM(SpaceLeaseArea) 
                                FROM dbo.data 
                                WHERE NextSpaceLeaseID IS NULL), 'P1') AS '% of Commercial Total SF'
INTO
    industryExposure
FROM 
    dbo.data
WHERE 
    NaicsID NOT LIKE '%[Legacy Lease]%' 
    AND NextSpaceLeaseID IS NULL
GROUP BY 
    NaicsID, NaicsName;

【问题讨论】:

  • 你研究过rollup吗?
  • 您要在同一个表中存储常规行和汇总行?
  • 旁注,不要使用单引号 (') 作为别名。单引号用于文字字符串,而不是分隔标识对象名称。一些为别名使用单引号的方法已被弃用,仅在您定义它们时才有效,在其他地方无效; ORDER BY 'Quantity'不会按别名为 'Quantity' 的列排序。坚持使用不需要分隔标识的对象和别名,如果您必须分隔标识它们,请使用 T-SQL 标识符、方括号 ([]) 或 ANSI-SQL 的双引号 ( ").
  • 考虑到上面所有的FORMAT 调用,看起来您正在尝试在 SQL 层中完成表示/报告层的工作。也许您最好在表示层中进行总计和格式化(当然应该是格式化)
  • @Austin yes 进入 inudstryExposure 表

标签: sql sql-server tsql


【解决方案1】:

您可以为此使用GROUPING SETSGROUPING() 函数会告诉您列是否已被分组。

补充说明:

  • 您可以将两个子查询重构为一个CROSS JOIN。条件聚合可能更快,但我已将其留给您。
  • 目前尚不清楚为什么您认为需要 DISTINCT,因为无论如何您都在分组。
  • 除以子查询值的两列可能不会给出预期的结果,您可能需要以其他方式计算除法。我没有样本数据和预期结果,所以我不知道您需要什么
  • 不要不要使用'' 引用列名,而是使用[]
SELECT
    GETDATE() AS RefreshDate,
    d.NaicsID AS [NAICS Code],
    CASE WHEN GROUPING(d.NaicsName) = 1 THEN 'Total' ELSE d.NaicsName END AS Industry,
    FORMAT(SUM(d.RemainingTerm * d.BaseRent) / SUM(d.BaseRent), 'N1') AS [Weighted Average Duration],
    FORMAT(SUM(d.BaseRent), 'C0') AS [Occupied Contract Rent],
    FORMAT(SUM(d.BaseRent) / v.Total, 'P1') AS [% of Commercial Total Rent],
    FORMAT(SUM(d.SpaceLeaseArea), 'N0') AS [Occupied SF],
    FORMAT(SUM(d.SpaceLeaseArea) / v.Total, 'P1') AS [% of Commercial Total SF]
INTO
    industryExposure
FROM 
    dbo.data d
CROSS JOIN (
    SELECT SUM(d2.SpaceLeaseArea) AS Total
    FROM dbo.data d2
    WHERE d2.NextSpaceLeaseID IS NULL
) v
WHERE 
    d.NaicsID NOT LIKE '%[Legacy Lease]%' 
    AND d.NextSpaceLeaseID IS NULL
GROUP BY GROUPING SETS (
    (d.NaicsID, d.NaicsName, v.Total),
    ()
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2011-11-23
    • 2023-03-21
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多