【问题标题】:Eliminating matching values in a SQL result set消除 SQL 结果集中的匹配值
【发布时间】:2012-10-26 16:11:16
【问题描述】:

我有一个包含交易列表(发票和信用)的表格,我需要获取发票和信用不匹配的所有行的列表。

例如

user     product    value
bill     ThingA     200
jim      ThingA    -200
sue      ThingB     100
liz      ThingC      50

我只想看到第三和第四行,因为其他的值匹配。

如果我选择产品 sum(value),我可以做到这一点 ... 按产品分组 总和(值) 0

效果很好,但我也想返回用户名。

一旦我将用户添加到选择中,我也需要按它进行分组,这会造成混乱,因为用户和产品的数量不匹配。

有什么想法吗?我正在使用 MS SQL 2000...

干杯

【问题讨论】:

    标签: tsql sql-server-2000 grouping matching suppress


    【解决方案1】:

    你可以这样做:

      SELECT tab2.user, product, sum_val
      FROM 
         (SELECT product, SUM(value) sum_val 
         FROM your_table
         GROUP BY product HAVING SUM(value) <> 0) tab1 
      INNER JOIN your_table tab2 
      ON tab1.product = tab2.product
    

    【讨论】:

    • 如果表有两个不同用户的某些产品的两个正面交易,这将不起作用。考虑到 OP 上下文,仍然是一个很好的解决方案!
    • 我只是在我的答案中使用了 OP 查询,以便 OP 可以在他/她的解决方案中使用他/她的原始查询....
    【解决方案2】:

    @LolCoder 的解决方案很好,但是在“sue”和“liz”都有“Thing B”和“100”值的上下文中,您可以使用我的查询检索以下结果集:

    | product | value | users    |
    +----------------------------+
    | Thing B | 200   | sue, liz |
    

    这里是查询:

    select product
          ,sum(value) as value
          ,Stuff(( select ',' + convert(varchar(40), SQ.user)
                     from YourTable SQ
                    where Q.product = SQ.product
                    for xml path('')
                ), 1, 1, '') as users
      from YourTable Q
     group by Q.product
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2012-01-11
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多