Как суммировать столбец 1 и выбрать столбец 2 по условию? - PullRequest
1 голос
/ 25 июня 2019

Я придерживался того, как суммировать столбец A и выбрать столбец B с условием, если в столбце B >= 50 выбрать этот идентификатор строки.

Пример таблицы +----+-----------+---------+ | 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

Результат должен быть

enter image description here

Есть предложения?

Ответы [ 5 ]

1 голос
/ 25 июня 2019

Вы можете включить сумму в подзапрос в предложении SELECT вашего запроса следующим образом:

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

Однако остается неясным, какую из пяти действительных записей следует выбрать. Вы указали, что это должна быть запись, где PERCENT имеет значение 56, но ИМХО значение 50 также возможно, как 87, 95 и 107 (?). Неясно, почему вы выбираете значение 56 в качестве правильного. Если это не имеет значения, вы можете использовать TOP (1) в предложении SELECT, но если это имеет значение, вы должны расширить предложение WHERE соответствующими условиями / фильтрами.

Смешивание агрегированных данных из групп обратно с отдельными элементами / записями, как это часто бывает нечетким. Я считаю, что это «запах кода», и здесь, в вашем вопросе о StackOverflow, это может указывать на XY-проблему . В любом случае, если вы не будете осторожны, эти результаты запроса могут быть неверно истолкованы. Всегда помните, что такие агрегированные данные в результате (в данном случае поле PRICE) практически не имеют ничего общего с подробными данными в результате (в данном случае поля ID и PERCENT). Если вы не хотите объединить свои агрегированные данные с вашими подробными данными (например, в расчете), но вы не указываете, что хотите что-то подобное в своем вопросе ...

1 голос
/ 25 июня 2019

Попробуйте запрос ниже:

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
0 голосов
/ 25 июня 2019

Вы можете попробовать следующий код:

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

Я использую предложение OVER, чтобы извлечь / прочитать данные из таблицы только один раз - один просмотр таблицы.

0 голосов
/ 25 июня 2019

Не уверен, зачем вам это нужно, но, конечно, вы можете архивировать вышеприведенный вывод, используя запрос ниже

Пример данных

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
0 голосов
/ 25 июня 2019

Вы можете сделать этот трюк, чтобы получить результат 2 запросов в 1 запрос:

 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
...