【问题标题】:Group by two columns and display grand total in every row按两列分组并在每一行显示总计
【发布时间】:2013-07-24 19:22:06
【问题描述】:

以下是列表数据。

Code   ItemCount   Type      Amount 
----------------------------------------
B001    1          Dell         10.00
B001    1          Dell         10.00
B001    1          Apple        10.00
B001    2          Apple        20.00
B001    2          Apple        20.00
B114    1          Apple        30.50
B114    1          Apple        10.00

我需要一个按代码和类型分组的结果,并对ItemCount 进行总计,并得到每行中Amount 的总计。

这可能吗?

Code   ItemCount    Type      Amount 
----------------------------------------
B001    2          Dell          20.00
B001    5          Apple         50.00
B114    2          Apple         40.50 

【问题讨论】:

  • 为什么每样东西的总量都一样?

标签: sql sql-server group-by sum


【解决方案1】:

请尝试:

SELECT
    Code,
    SUM(ItemCount) ItemCount,
    Type,
    SUM(Amount) Amount
FROM
    YourTable
GROUP BY Code, Type
ORDER BY Code

【讨论】:

  • 你是按 itemcount 分组的,你确定它会给出正确的结果吗?
  • 即使在 2017 年这个问题仍然是相关的,并且不需要 (SELECT SUM(Amount) FROM YourTable) Amount 部分。将其替换为 sum(Amount) Amount 就足够了。
【解决方案2】:

你可以试试这个查询:

SELECT Code,SUM(ItemCount) AS ItemCount,Type,SUM(Amount) AS Amount
FROM
    table
GROUP BY Code, Type

这会给你正确的结果。您需要按CodeType 分组,而不是ItemCount

【讨论】:

    【解决方案3】:

    这看起来像家庭作业。

    (我发誓,当我第一次看到这个问题时,我以为这被标记为 MySQL,但标题清楚地显示了 MS SQL)

    对于 MySQL, 这个查询将返回指定的结果集:

    SELECT t.Code
         , SUM(t.ItemCount) AS ItemCount
         , t.Type
         , s.Amount AS Amount
      FROM mytable t
     CROSS
      JOIN ( SELECT SUM(r.Amount) AS Amount
               FROM mytable r
           ) s 
     GROUP
        BY t.Code
         , t.Type
     ORDER BY t.Code ASC, t.Type DESC
    

    对于其他数据库,删除对于 MySQL 列别名周围的反引号。

    如果您需要保留大小写,对于 Oracle,标识符用双引号括起来。对于 SQL Server,标识符用方括号括起来。 MySQL 标识符用反引号括起来。

    【讨论】:

      【解决方案4】:

      您提供的金额与示例数据不同,但这适用于示例数据值:

      SELECT Code, SUM(ItemCount) AS ItemCount, [Type], SUM(Amount) AS Amount 
      FROM dbo.TestSubs GROUP BY Code,[Type] ORDER BY Code
      

      【讨论】:

        【解决方案5】:

        如果我的理解是正确的,每行的实际总数是 itemcount 和金额的乘积,那么您可以使用下面的代码。如果不使用@Abu 的代码。

        ;WITH cte AS
        (
            SELECT Code, ItemCount, Type, Amount, ItemCount * Amount AS TotalAmount FROM <Table>
        )
        SELECT 
            Code,
            SUM(ItemCount),
            Type,
            SUM(TotalAmount)
        FROM cte
        GROUP BY Code, Type
        

        【讨论】:

          【解决方案6】:

          您可以尝试这个更简单的解决方案:

          select Code,sum(ItemCount),Type,sum(Amount) from table group by code,type
          

          理解“分组依据”会很方便

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-27
            • 1970-01-01
            相关资源
            最近更新 更多