[英]How to select rows based on the sum of values in one column meeting a condition?
[英]How to SUM column 1 and select column 2 by condition?
如果列B >= 50
選擇此行ID,則我一直在考慮如何對列A
求和並選擇列B
的條件。
像這樣的示例表+----+-----------+---------+ | ID | PRICE | PERCENT | +----+-----------+---------+ | 1 | 5 | 5 | | 2 | 18 | 20 | | 3 | 7 | 50 | | 4 | 16 | 56 | | 5 | 50 | 87 | | 6 | 17 | 95 | | 7 | 40 | 107 | +----+-----------+---------+
+----+-----------+---------+ | 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
的行中選擇
結果應該是
有什么建議么?
請嘗試以下查詢:
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
您可以在查詢的SELECT
子句中將總計包括在子查詢中,如下所示:
SELECT
[ID],
(SELECT SUM([PRICE]) FROM T) AS [PRICE],
[PERCENT]
FROM
T
WHERE
[PRICE] >= 50
但是,尚不清楚應選擇五個有效記錄中的哪個。 您指出這應該是PERCENT
值為56的記錄,但IMHO值為50也是可能的,就像87、95和107(?)一樣。 目前尚不清楚為什么選擇值56作為正確的值。 如果沒關系,則可以在SELECT
子句中使用TOP (1)
,但如果有關系,則應使用適當的條件/過濾器擴展WHERE
子句。
這樣將來自組的聚合數據與單個元素/記錄混合在一起通常是模糊的。 我認為這是一種“代碼異味”,在您關於StackOverflow的問題中,這可能表示XY問題 。 無論如何,如果您不小心,這些查詢結果可能很容易被誤解。 始終記住,結果中的此類匯總數據(在本例中為PRICE
字段)與結果中的明細數據(在本例中為ID
和PERCENT
字段)幾乎無關。 除非您想將匯總數據與明細數據結合起來(例如在計算中),但是您沒有表示您想要在問題中使用類似的東西...
您可以執行此技巧以使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
不確定為什么需要這樣做,但是可以肯定的是,您可以使用以下查詢對以上輸出進行存檔
樣本數據
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
您可以嘗試以下代碼:
SELECT TOP (1) [ID], SUM(PRICE) OVER (), [PERCENT]
FROM @tbl
ORDER BY CASE WHEN [PERCENT] > 50 THEN 0 ELSE 1 END, [ID];
我正在使用OVER
子句,以便僅從表中提取/讀取數據一次-一次表掃描。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.