如何对第1列求和并按条件选择第2列?

时间:2019-06-25 03:59:33

标签: sql sql-server aggregate-functions

我一直在考虑如何对列A求和并选择列B的条件,条件是如果列B >= 50选择此行ID。

示例表是这样的 +----+-----------+---------+ | ID | PRICE | PERCENT | +----+-----------+---------+ | 1 | 5 | 5 | | 2 | 18 | 20 | | 3 | 7 | 50 | | 4 | 16 | 56 | | 5 | 50 | 87 | | 6 | 17 | 95 | | 7 | 40 | 107 | +----+-----------+---------+

SELECT ID, SUM(PRICE) AS PRICE, PERCENT FROM Table

IDPERCENT列,我想从PERCENT >= 50的行中进行选择

结果应该是

enter image description here

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

请尝试以下查询:

declare @tbl table(ID int, PRICE int, [PERCENT] int);
insert into @tbl values
(1, 5, 5),
(2, 18, 20),
(3, 7, 50),
(4, 16, 56),
(5, 50, 87),
(6, 17, 95),
(7, 40, 107);

select top 1 ID,
             (select sum(PRICE) from @tbl) PRICE,
             [PERCENT]
from @tbl
where [PERCENT] > 50

答案 1 :(得分:1)

您可以像这样在查询的SELECT子句中将总计包括在子查询中:

SELECT
    [ID],
    (SELECT SUM([PRICE]) FROM T) AS [PRICE],
    [PERCENT]
FROM
    T
WHERE
    [PRICE] >= 50

但是,仍然不清楚应该选择五个有效记录中的哪个。您指出应该是PERCENT的值为56的记录,但IMHO值为50也是可能的,就像87、95和107(?)一样。目前尚不清楚为什么选择值56作为正确的值。如果没关系,可以在TOP (1)子句中使用SELECT,但是如果有关系,则应使用适当的条件/过滤器扩展WHERE子句。

像这样将来自各个组/组的聚合数据混合回去通常是模糊的。我认为这是“代码异味”,在您关于StackOverflow的问题中,它可能表示XY-problem。无论如何,如果您不小心,这些查询结果可能很容易被误解。始终记住,结果中的此类聚合数据(在本示例中为PRICE字段)与结果中的明细数据(在本示例中为IDPERCENT字段中几乎无关) )。除非您想将汇总数据与明细数据结合起来(例如在计算中),但是您并没有表示您想要在问题中使用类似的东西...

答案 2 :(得分:0)

您可以执行此操作以使1个查询中有2个查询的结果:

 select ID as ID,T.[PERCENT] AS B, 0 as sumA
 from Table_1 as T
 where T.[PERCENT]>=50
 union All
 select 0 as ID,0 AS B, sum(t.[PRICE]) as sumA
 from Table_1 as T

答案 3 :(得分:0)

不确定为什么要这样做,但是可以肯定的是,您可以使用以下查询对上方输出进行归档

样本数据

declare  @data table
(Id int, Price int, [Percent] int)
insert @data
VALUES (1,5,5),           
      (2,18,20),
      (3,7,50),
      (4,16,56),
      (5,50,87),
      (6,17,95),
      (7,40,107)

查询

select top 1 ID,  (select sum(price) from @data) as Price, [Percent ]
from  @data
where [Percent ] >50

答案 4 :(得分:0)

您可以尝试以下代码:

SELECT TOP (1) [ID],  SUM(PRICE) OVER (),  [PERCENT] 
FROM @tbl
ORDER BY CASE WHEN [PERCENT] > 50 THEN 0 ELSE 1 END, [ID];

我正在使用OVER子句,以便仅从表中提取/读取数据一次-一次表扫描。