2015-03-18 2 views
-2

Я пытаюсь найти менее 10% счетов доходов из таблицы. Ниже приведен снимок таблицы. В принципе, я хочу добавить столбец смещения дохода в таблице.Поиск менее 10% счетов доходов в таблице

ACCOUTS REVENUE REVENUEMIX 
ACCOUNT1 100  2% 
ACCOUNT2 200  4% 
ACCOUNT3 500  9% 
ACCOUNT4 1000 19% 
ACCOUNT5 1500 28% 
ACCOUNT6 2000 38% 
TOTAL 5300 100% 
+0

Если вы делаете это в хранимой процедуре или нескольких оператор сценария, вы можете заполнить переменную с общего дохода, а затем RevenueMix простой расчет доходов/@ Общий доход. –

+0

Вы хотите получить 2%, 4%, 19% записи из приведенной выше таблицы, которая составляет менее 10% ??? –

+0

Да. Я хочу иметь возможность заполнить столбец Revenuemix в таблице. –

ответ

4
DECLARE @P INT; 
SET @P = 10; 

WITH CTE AS 
(
    SELECT ACCOUNTS, 
      REVENUE, 
      CAST(REVENUE AS DECIMAL(5,0))/(SUM(REVENUE) OVER())*100 REVENUEMIX 
    FROM dbo.YourTable 
) 
SELECT * 
FROM CTE 
WHERE REVENUEMIX < @P; 

Here is a sqlfiddle с демо его. И результаты, которые я получаю для выборки данных являются:

╔══════════╦═════════╦═════════════╗ 
║ ACCOUNTS ║ REVENUE ║ REVENUEMIX ║ 
╠══════════╬═════════╬═════════════╣ 
║ ACCOUNT1 ║  100 ║ 1.886792452 ║ 
║ ACCOUNT2 ║  200 ║ 3.773584905 ║ 
║ ACCOUNT3 ║  500 ║ 9.433962264 ║ 
╚══════════╩═════════╩═════════════╝ 
0

Попробуйте REPLACE() and CAST()

FIDDLE DEMO

SELECT * 
FROM tab_1 where cast(Replace(REVENUEMIX,'%','') as decimal(10,4))<10 
0

Если я правильно читал этот вопрос, вы хотите, чтобы включить столбец RevenueMix, что вы показали в таблице примеров таблицу, содержащую только учетную запись и доход? Нечто подобное должно работать:

create table #table (
    account nvarchar(10), 
    revenue int 
    ) 

insert #table values 
('ACCOUNT1', 100 ), 
('ACCOUNT2', 200 ), 
('ACCOUNT3', 500 ), 
('ACCOUNT4', 1000 ), 
('ACCOUNT5', 1500 ), 
('ACCOUNT6', 2000 ) 

declare @TotalRevenue int 
declare @MinimumRevenueMix numeric(8,2) = 10.0 
select @TotalRevenue = SUM(Revenue) from #table 

select a.account, 
     a.revenue, 
     convert(nvarchar(20), a.RevenueMix) + '%' RevenueMix 
    from (
     select account, 
       revenue, 
       convert(numeric(8,2), convert(float, revenue)/convert(float, @TotalRevenue)) * 100 RevenueMix 
      from #table 
     ) a 
    where 
     a.RevenueMix < @MinimumRevenueMix 

drop table #table 
+0

Мне нравится ответ Ламака ... Я не знал о СУМ (ДОХОДЕ) НАЗАД(), очень удобно. –

+0

Можем ли мы пойти на один шаг дальше и поставить шапку ревюмикса на 10. Итак, когда мой реванш достиг 10% следующего Корреспондирующая строка должна начинаться с 0 из другой учетной записи. Другими словами, я хочу выбрать только те учетные записи, чья сумма отступлений меньше или равна 10% в новую таблицу. Возможно ли это? –