我一直在考虑如何对列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
第ID
和PERCENT
列,我想从PERCENT >= 50
的行中进行选择
结果应该是
有什么建议吗?
答案 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
字段)与结果中的明细数据(在本示例中为ID
和PERCENT
字段中几乎无关) )。除非您想将汇总数据与明细数据结合起来(例如在计算中),但是您并没有表示您想要在问题中使用类似的东西...
答案 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
子句,以便仅从表中提取/读取数据一次-一次表扫描。