【问题标题】:Aggregate with row merge使用行合并聚合
【发布时间】:2013-09-20 06:00:29
【问题描述】:

我有一个表 my_table,其中包含 state、month、ID 和 sales 列。

我的目标是将具有相同状态、月份、ID 的不同行合并为一行,同时将这些选定行的销售列汇总到合并行中。

例如:

state    month    ID    sales
-------------------------------
FL       June     0001   12,000
FL       June     0001    6,000
FL       June     0001    3,000
FL       July     0001    6,000
FL       July     0001    4,000
TX       January  0050    1,000
MI       April    0032    5,000
MI       April    0032    8,000
CA       April    0032    2,000

这是我应该得到的

state    month    ID    sales
-------------------------------
FL       June     0001   21,000
FL       July     0001   10,000  
TX       January  0050   1,000
CA,MI    April    0032   15,000

【问题讨论】:

  • TX 和 MI 要走到一起了吗?其背后的逻辑是什么?
  • 抱歉输出应该是 CA 和 MI 而不是 TX 和 MI
  • @Ashutosh Arya 他希望按月销售额对每个州进行分组。

标签: mysql sql


【解决方案1】:

您需要为此使用GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT State) AS State
 , Month, ID, SUM(Sales)
FROM Table1
GROUP BY Month, ID;

this SQLFiddle


更新(适用于 SQL Server)

对于 SQL Server,您可以使用 STUFF()

SELECT  state = 
    STUFF((SELECT DISTINCT ' , ' + state
           FROM Table1 b 
           WHERE b.ID = a.ID
             AND b.month = a.month
          FOR XML PATH('')), 1, 2, '')
    ,month, ID, SUM(sales) AS Sales
FROM Table1 a
GROUP BY month,ID;

this SQLFiddle

【讨论】:

  • SQL Server 中的“GROUP_CONCAT”是什么?
  • @srid99: 我也在检查,没有直接的解决方案,我发布的答案对你有用,但你也可以参考stackoverflow.com/questions/8948531/…
  • @all : 正在处理一些东西....实际上这是虚拟查询,实际查询要复杂一些...顺便说一句谢谢
【解决方案2】:

请试试这个:

SELECT B.STATE, A.ID, SUM(A.SALES) AS SALES 
FROM MYTABLE A
INNER JOIN
  (SELECT DISTINCT 
   CASE WHEN A.state = B.STATE THEN A.STATE ELSE A.STATE+','+B.STATE END AS STATE,
   ID
   FROM MYTABLE A
   INNER JOIN MYTABLE B ON A.ID = B.ID) B
ON A.STATE = B.STATE
GROUP BY B.state, A.month, A.ID

如果它查询需要任何纠正,请告诉我。

【讨论】:

    【解决方案3】:

    您真正想做的是分组而不是合并行。 在聚合不同值的同时,将具有共同值的多行分组。

    使用 Group By 子句实现上述目的:

    select state,month,ID sum(sales)
    from my_table
    group by
    state, month, ID
    

    要了解更多关于组的信息,请参见此处:http://www.w3schools.com/sql/sql_groupby.asp

    【讨论】:

    • 我认为你应该按月分组,并尝试连接状态,因为他不是要求基于状态的总和,而是基于月的总和,用于每个月的现有状态。
    • 我想实际获取销售额总和而不对状态进行分组,但在显示时希望将不同的状态合并到单行中。 - 谢谢
    猜你喜欢
    • 2020-12-25
    • 2014-10-13
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多