【问题标题】:Select Multiple value from a table but group by one value从表中选择多个值但按一个值分组
【发布时间】:2020-05-27 00:47:35
【问题描述】:

我正在尝试从两个表中选择多个值,但我想按单个值分组。我尝试在 select 中使用 max(value) 但 max 返回的是最大的,而不是确切的。

这是我的桌子

我需要的结果是这样的

Result : HeadQuarterId - A, PropertyName - Name1, Amount - 102
         HeadQuarterId - B, PropertyName - Name5, Amount - 30

这是我的查询

SELECT  Headquarterid,Max(PropertyName),sum(Amount)  
FROM Table1 A LEFT OUTER JOIN Table2 B
ON A.Propetyid = B.PropertyId  
GROUP BY Headquarterid

这里我使用了左外连接,这样我就可以从左表中获取所有数据,即使它在右表中不可用。

我也不能在 where 条件下使用 A.HeadquarterID = A.PropertyId,因为我在该表中有其他依赖项。请提出其他方法来实现此结果。

【问题讨论】:

  • 我不确定我是否理解您想要实现的目标...您示例中的 101 来自哪里?预期的结果究竟是什么?您的表格似乎通过 propertyid 具有 1:1 的关系 - 所以我希望总部 A 的结果为 46
  • @Tyron78 从问题来看,我相信101是表2中所有Amount的总和
  • @Tyron78 是金额栏的总和
  • 用您正在使用的数据库标记您的问题。
  • 编辑问题添加更多示例数据和所需的结果会有所帮助。

标签: sql group-by sql-server-2012


【解决方案1】:

这提供了我预期的结果。

SELECT HQTRS1 AS headId,Max(LLORD1) AS headName, sum(Amount) AS amount  
FROM 
    (SELECT DISTINCT HeadQuarterId AS HQTRS1, PropertyName AS LLORD1 FROM Table_1 WHERE HeadQuarterId = PropertyId) AS temp
        INNER JOIN Table_1 AS A ON A.HeadQuarterId  = temp.HQTRS1
        LEFT OUTER JOIN Table_2 B
        ON B.PropertyId = A.PropertyId
        GROUP BY HQTRS1

【讨论】:

    【解决方案2】:

    根据您想要的示例数据 window 功能:

    select distinct t1.HeadQuarterId, 
           max(t1.PropertyName) over (partition by t1.HeadQuarterId) as PropertyName,
           sum(t2.amount) over (partition by t1.HeadQuarterId) as amount
    from t1 left join
         t2
         on t2.PropertyId = t1.PropertyId;
    

    【讨论】:

    • @bala3569 。 . .您不断更改示例数据。立即尝试答案。
    • 应该是 Name1 而不是 Name3
    【解决方案3】:

    我建议在 cte / 子查询中获取每个 ID 的 headquartename,然后将其再次加入 T1 并在第二个 cte / 子查询中将 T1 加入 T2。这样您就可以根据单个组计算总和:

    WITH cte AS(
    SELECT ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY CASE WHEN t1.ID = t1.PROPERTYID THEN 0 ELSE 1 END) rn, t1.ID, t1.Name
      FROM t1
    ),
    cte2 AS(
    SELECT c.name cName, t1.*, t2.Value
      FROM t1
      INNER JOIN cte c ON c.ID = t1.ID AND c.rn = 1
      LEFT JOIN t2 ON t1.Propertyid = t2.propertyid
    )
    SELECT c2.id, c2.cname, sum(c2.value) value
      FROM cte2 c2
      GROUP BY c2.id, c2.cname
    

    详见 SQLFiddle:http://sqlfiddle.com/#!18/8bf66/13/2

    当然,您可以只使用WHERE ID = PROPERTYID 来构建不带row_number 的第一个cte - 我想说的是...

    【讨论】:

      【解决方案4】:

      我想我明白了。您想要具有最大值的总部,恰好是A。如果是这样:

      select t1.*, sum(t2.amount) over () as total
      from t1 left join
           t2
           on t2.PropertyId = t1.PropertyId
      order by t2.amount desc
      fetch first 1 row only;
      

      注意:并非所有数据库都支持fetch first。例如,它可能拼写为 limit 或使用 select top (1)。

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 1970-01-01
        • 2013-08-22
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        相关资源
        最近更新 更多