【问题标题】:How to get sub total and grand total Based on heading and sub heading in Sql Server如何根据 Sql Server 中的标题和子标题获取小计和总计
【发布时间】:2018-08-12 05:22:10
【问题描述】:

我有这个 SQL 代码

SELECT TOP (100) PERCENT 
    dbo._SHIFT._SHIFTNAME AS [Shift Name], dbo._TANK._TANKNAME AS [Tank Name],
    dbo._NOZZLE._NOZZLENAME AS [Nozzle Name], 
    dbo._SHIFTENTRYDET._OPENING AS Opening, dbo._SHIFTENTRYDET._CLOSING AS Closing, 
    SUM(dbo._SHIFTENTRYDET._TOTALSALE) AS [Total Sale], 
    dbo._SHIFTENTRYDET._RATE AS Rate, 
    CASE
       WHEN GROUPING(dbo._SHIFT._SHIFTNAME) = 1 
          THEN NULL 
       WHEN GROUPING(dbo._TANK._TANKNAME) = 1 
          THEN NULL
       ELSE SUM(dbo._SHIFTENTRYDET._TOTALAMOUNT)
    END AS Amount
FROM      
    dbo._NOZZLE 
RIGHT OUTER JOIN
    dbo._SHIFTENTRYDET ON dbo._NOZZLE._NOZZLEID_PK = dbo._SHIFTENTRYDET._NOZZLEID_PK 
LEFT OUTER JOIN
    dbo._TANK ON dbo._SHIFTENTRYDET._TANKID_PK = dbo._TANK._TANKID_PK 
RIGHT OUTER JOIN
    dbo._SHIFTENTRY ON dbo._SHIFTENTRYDET._SHIFTENTRYID_PK = dbo._SHIFTENTRY._SHIFTENTRYID_PK 
LEFT OUTER JOIN
    dbo._SHIFT ON dbo._SHIFTENTRY._SHIFTID_PK = dbo._SHIFT._SHIFTID_PK
WHERE     
    (dbo._SHIFTENTRY._ISDELETED = N'1') 
    AND (dbo._SHIFT._ISDELETED = N'1') 
    AND (dbo._SHIFTENTRYDET._ISDELETED = N'1')
GROUP BY GROUPING SETS  
    ((dbo._SHIFT._SHIFTNAME, dbo._TANK._TANKNAME, dbo._NOZZLE._NOZZLENAME, dbo._SHIFTENTRYDET._OPENING, dbo._SHIFTENTRYDET._CLOSING, dbo._SHIFTENTRYDET._RATE), (dbo._SHIFT._SHIFTNAME, dbo._TANK._TANKNAME)) 

结果

但我想要以下结果

我使用GROUP BY GROUPING SETSGROUP BY ROLLUPGROUP BY CUBE,但没有运气。

如果我删除 GROUP BY 和 GROUPING SETS 等,简单的数据将如下所示

Excel 文件 Google Drive 链接:https://drive.google.com/open?id=1DgyI_7-p1l7n1KjeAnf1DerQTGLJC-wB

Excel 文件有 3 张表

  1. 样本数据,这里是没有分组的数据
  2. 预期结果
  3. 分组集结果

【问题讨论】:

  • 你应该简化这个例子,让其他人更容易理解。
  • @GordonLinoff 完成。请看一下
  • 是的,这更详细。当然,您可以有一个包含数据的表来表示问题。
  • 提供示例数据而不是屏幕截图。另外,为什么会有“TOP (100) Percent”?
  • @Cool_Br33ze TOP (100) Percent 由 SQL Managent 工作室添加,可能是我订购时添加的

标签: sql sql-server sql-server-2008 group-by grouping


【解决方案1】:

您的两个分组集都包含 Shiftname 和 Tankname,因此分组函数将始终返回 0。

由于 WHERE 子句包含 Shift、Shiftentry 和 Shiftentrydet 的条件,因此记录必须存在,因此连接是 INNER JOIN(好吧,可能不适用于 Tank 和 Nozzle)。

按键值分组而不是按显示名称分组会更好,而且按附加信息(打开、关闭...)分组在我看来似乎是错误的。唯一应该分组的字段是 Shift、Tank 和 Shiftentrydet 的键(而不是 Nozzle,因为 Nozzles 似乎构成了细节),所以我会在子查询 (CTE) 中进行分组和计算并加入其余部分在主查询中,虽然查询了 Shiftentrydet 和 Shift 表两次(一次用于计算,一次用于显示)。我猜一列 Shiftentrydet_PK 确实存在)。

最后,您的查询不会返回 Shift-Tank-和 Nozzle-names 以及同一列中总计的标题,也不会为 Shift 和 Tank 创建标题行。为此,我建议使用报告 (SSRS)。

对于仅查询非报告解决方案,请尝试以下方法(未测试):

WITH CTE_grp (SHIFTID_PK, TANKID_PK, Shipentrydet_PK, Amount) AS (
    SELECT se._SHIFTID_PK, sed._TANKID_PK, sed.Shipentrydet_PK, SUM(sed._TOTALAMOUNT)
    FROM dbo._SHIFT s
      INNER JOIN dbo._SHIFTENTRY se ON s._SHIFTID_PK = se._SHIFTID_PK
      INNER JOIN dbo._SHIFTENTRYDET sed ON se._SHIFTENTRYID_PK = sed._SHIFTENTRYID_PK
    WHERE (se._ISDELETED = N'1') AND (sed._ISDELETED = N'1') AND (s._ISDELETED = N'1')
    GROUP BY se._SHIFTID_PK, sed._TANKID_PK, sed.Shipentrydet_PK WITH ROLLUP
)
SELECT s._SHIFTNAME AS [Shift Name], t._TANKNAME AS [Tank Name], n._NOZZLENAME AS [Nozzle Name]
  , sed._OPENING AS Opening, sed._CLOSING AS Closing, sed._TOTALSALE AS [Total Sale]
  , sed._RATE AS Rate, c.Amount
FROM CTE_grp c
  LEFT OUTER JOIN dbo._SHIFT s ON c.SHIFTID_PK = s._SHIFTID_PK
  LEFT OUTER JOIN dbo._TANK t ON c.TANKID_PK = t._TANKID_PK
  LEFT OUTER JOIN  dbo._SHIFTENTRYDET sed ON c.Shipentrydet_PK = sed.Shipentrydet_PK
    LEFT OUTER JOIN dbo._NOZZLE n ON sed._NOZZLEID_PK = n._NOZZLEID_PK;

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多