【问题标题】:group by clause query分组查询
【发布时间】:2010-09-09 14:12:02
【问题描述】:

我有一张这样的表格,

我想按客户名称分组,其中本地金额的总和应超过 50000,否则我需要删除那些不满足的记录?

如何在sql server 2005中实现?

TRN 259 3   9/9/2010    6622    68667(Rs) ABHIJIT KATARE  
TRN 260 3   9/9/2010    6622    14635(Rs)   ABHIJIT KATARE  
TRN 235 3   9/9/2010    6586    68128   AJAY PARASRAMPURIA  
TRN 236 3   9/9/2010    6586    14490   AJAY PARASRAMPURIA  
TRN 257 3   9/9/2010    6621    68667   ANAND DESAI  
TRN 258 3   9/9/2010    6621    14635   ANAND DESAI  
TRN 287 3   9/9/2010    6817    119095  ANAND KATAKAM  
TRN 242 3   9/9/2010    6594    95689   ANILKUMAR MUTHUNPARA  
TRN 211 3   9/9/2010    6507    52239   ARBIND KUMAR GUPTA  
TRN 212 3   9/9/2010    6538    63183   ASHOK KELKAR  
TRN 185 3   9/9/2010    6431    140610  BANSAL Y.K  
TRN 186 3   9/9/2010    6431    46845   BANSAL Y.K  
TRN 248 3   9/9/2010    6600    72565   BENNO HANS LUKE  

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    试试这个选择:

    SELECT * FROM Table
    GROUP BY CustomerName
    HAVING SUM(LocalAmount) > 50000
    

    试试这个删除(@RedFilter 的修改版本):

    delete from MyTable 
    where CustomerName in (
        select CustomerName 
        from Table
        group by CustomerName 
        having sum(LocalAmount) <= 50000
    )
    

    【讨论】:

      【解决方案2】:

      select * from MyTable group by CustomerName having sum(LocalAmount) &gt; 50000

      【讨论】:

        【解决方案3】:

        查看好的行使用:

        SELECT
            cusotmerName ,SUM(localAmount)
            FROM YourTable
            GROUP BY cusotmerName
            HAVING SUM(localAmount)>50000 
        

        删除坏行使用:

        DELETE YourTable
        WHERE
            CustomerName IN (SELECT
                                     cusotmerName
                                     FROM YourTable
                                     GROUP BY cusotmerName
                                     HAVING SUM(localAmount)<50000 
                                )
        

        【讨论】:

          【解决方案4】:

          这将向您显示少于 50000 的客户:

          select CustomerName, sum(LocalAmount)
          from MyTable
          group by CustomerName
          having sum(LocalAmount) <= 50000
          

          请注意,如果有的话,最好按CustomerID 分组,因为可能有重复的名称。然后,您可以这样做删除:

          delete from MyTable 
          where CustomerID in (
              select CustomerID 
              from MyTable
              group by CustomerID 
              having sum(LocalAmount) <= 50000
          )
          

          【讨论】:

          • 你怎么知道有一个 CustomerID 列?即使有一个,也可能有多个 ID 具有相同的显示名称。我在一个客户购买另一个客户的系统中看到了这一点,他们更改了显示名称,但 FK 仍然使用原始 ID
          • 我不知道,这是一个假设 - 这就是为什么第一个示例使用客户名称。
          【解决方案5】:

          这个语法看起来有点奇怪,但它确实有效!

          ;with cte as
          (
          select sum(LocalAmount) over (partition by cname) s 
          from yourtable
          )
          delete from cte where s <= 50000 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-07
            • 2015-10-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-09
            相关资源
            最近更新 更多