【问题标题】:how to sum conditionally?如何有条件地求和?
【发布时间】:2013-03-08 19:46:05
【问题描述】:

我有一张下表

Col1   Col2   Col3
A1     1      null
A1     2      null
B1     5      null
B2     6      null
M1     1      M
M2     2      M
M3     3      M
J1     1      J
J2     2      J

我想根据 Col1 对 Col2 求和。查询将如下所示,

select Col1, sum (Col2)
group by Col1

但是,如果 Col3 有相同的字母,我想为所有 Col1 总结 Col2。所以结果表应该是这样的

Col1    Col2 
A1      3
B1      5
B2      6
M1      6
M2      6
M3      6
J1      3
J2      3

如何更改我的查询以获取上述表格?

【问题讨论】:

  • 在您的结果中。 J2 = 2 而不是 3?
  • 你原来的问题有问题。
  • 如果 Col3 有相同的字母(非空),我需要 sum col2 一起。所以 J1 和 J2 在 col3 中有相同的字母 J,J1 和 J2 的结果都是 3。
  • 请通过添加适当的标签(Oracle、SQL Server、MySQL 等)指定您的目标关系数据库管理系统。可能有一些答案利用了不受普遍支持的语言或产品功能。此外,通过使用特定的 RDBMS 对其进行标记,您的问题可能会受到更适合回答的人的关注。

标签: sql-server group-by sum


【解决方案1】:

在评论/更新问题后进行编辑。我不知道一个聪明的方法,但似乎其他一些人有一个。

select * from (
select Col1, SUM(Col2) Col2
from Table
where Col3 is null
group by Col1

union

select mainset.Col1, tmp.Col2
from Table mainset
join 
(
    select Col3, SUM(Col2) Col2
    from Table
    where Col3 is not null
    group by Col3
) tmp on tmp.Col3 = mainset.Col3

where mainset.Col3 is not null
) fullset
order by fullset.Col1

【讨论】:

  • 我想你让我对 Col2 和 Col3 感到厌烦。我举了一个不好的例子,我会更新它。
【解决方案2】:

你可以这样做(我将表命名为#a):

    ;WITH col3Sum AS
    (
        SELECT Col3, SUM(Col2) SUM3
        FROM #a
        WHERE col3 IS NOT NULL
        GROUP BY col3
    ),
        col1Sum AS
    (
        SELECT Col1, SUM(Col2) sum1
        FROM #a 
        GROUP BY Col1
    )   
    SELECT c1.Col1, ISNULL(c3.SUM3, c1.sum1) AS Col2
    FROM col1Sum c1
    LEFT JOIN col3Sum c3
        ON c1.Col1 LIKE c3.Col3+'%'
    ORDER BY c1.Col1

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2020-01-12
    • 2020-08-06
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多