2013-05-29 4 views
-1

я в настоящее время запустить запрос:расчета процента на основе результатов запроса

select table1.columnA as Barrier_1, 
     table2.columnB as Action_1, 
    from table2 
    join table1 on table2.PrimKey = table1.PrimKey 
where table1.columnA is not null 
    and table2.columnB is not null 
group by table1.columnA, table2.columnB 
order by table1.columnA 

, которая возвращает таблицу:

Barrier_1 Action_1 
____________________ 
    01  | 01 
    01  | 02 
    02  | 01 
    02  | 03 
    02  | 04 
    03  | 02 
    03  | 03 
    04  | 01 
    05  | 04 

и то, что я хочу, чтобы это сделать, это вычислить процент каждого действие на барьер:

Barrier_1 Action_1 Percent_1 
________________________________ 
    01  | 01 | 60% 
    01  | 02 | 40% 
    02  | 01 | 20% 
    02  | 03 | 10% 
    02  | 04 | 70% 
    03  | 02 | 20% 
    03  | 03 | 80% 
    04  | 01 | 100% 
    05  | 04 | 100% 

Обратите внимание, что каждое действие может отображаться несколько раз за барьер.

Таким образом, каждый барьер имеет свой собственный набор действий. Например, барьер может иметь в общей сложности 5 действий (2 - действие 02 и 3 - действие 01).

+2

Можете ли вы расширить на то, что вы имеете в виду ' ... процент от каждого действия за барьер? –

+0

какую формулу вы используете для расчета каждой строки. Например, Барьер 05 с действием 04. Действие 04 существует дважды барьер 05 только один раз, почему это 100% против барьера 04 с действием 01 (с 3 записями) на 100%? – xQbert

+0

Итак, каждый барьер имеет свой собственный набор действий. Например, барьер может иметь в общей сложности 5 действий (2 - действие 02 и 3 - действие 01). Надеюсь, это ответит на оба вопроса. – rjbogz

ответ

0

Вы можете использовать подзапрос для получения суммы всех Actions за один Barrier. А затем рассчитать процент от Actions за один Barrier.

SELECT b.ColumnA 
, a.ColumnB 
, ROUND(CONVERT(DECIMAL(19,4), 
       COUNT(a.ColumnB))* 100/ 
CONVERT(DECIMAL(19,4), 
     (SELECT COUNT(ColumnB) FROM Action WHERE PrimKey=b.PrimKey)) 
, 2) AS Pros 
FROM Action a 
INNER JOIN Barrier b ON b.PrimKey=a.PrimKey 
GROUP BY b.ColumnA, a.ColumnB, b.PrimKey 
ORDER BY b.ColumnA 

Здесь ссылка на SQL Fiddle с данными, которые я использовал для тестирования ...

Если хотите добавить «%» - знак привести колонку, то вам необходимо преобразовать значение в процентах VARCHAR и добавить знак.

CONVERT(VARCHAR(20), @PercentageValue) + '%' AS PercentageValue 
+0

Как это будет работать с моим запросом? У меня нет третьей таблицы для использования. Это таблица Барьеры (таблица1) и таблица Actions (таблица2), и я не могу создать новую, если она не временная. Может, я что-то упустил? – rjbogz

+0

@ user1911612, я обновил свой ответ на две таблицы. Если мой он не работает для вас, пожалуйста, дайте некоторую структуру ваших таблиц ... – Fabio

0

Существует множество способов преодоления этого. Вот что я думаю, что это самый прямой пример:

SELECT table1.columnA as Barrier_1, 
    table2.columnB as Action_1, 
    ROUND(CAST(COUNT(*) AS FLOAT) 
      /CAST( (SELECT COUNT(*) FROM table2 t2 
         WHERE t2.PrimKey = table1.PrimKey) 
        AS FLOAT)*100,2) AS Percent_1 
    from table2 
    join table1 on table2.PrimKey = table1.PrimKey 
where table1.columnA is not null 
    and table2.columnB is not null 
group by table1.columnA, table2.columnB 
order by table1.columnA 

Если вы хотите добавить символ процента, вам придется конвертировать в VARCHAR в конце.

Примечание: Я уверен, преобразование плавать типа в примере, если требуется высокая степень точности в цифрах, то лучше использовать числовой/десятичный тип

+0

Это похоже на ответ Fabio. Это то, что у меня было первоначально, но только в подзапросе будет возвращено несколько значений. Мне нужно, чтобы он был уникальным для строки, в которой выполняется подзапрос, если это имеет смысл. – rjbogz

+0

Я предполагаю, что ваше предложение where и/или join не так точно, как в вашем примере? Или я неправильно понимаю? Предложение where в подзапросе должно быть точно таким же строгим, как исходный запрос из этой таблицы. – guitarultimate

+0

@guitarultimate, я не буду рекомендовать использование типа «FLOAT», если вы собираетесь «СОЗДАТЬ» значение этого типа. Тип «FLOAT» знает о некоторых проблемах с округлением: [«Round half up» для значений с плавающей запятой] (http://stackoverflow.com/questions/2370358/round-half-up-on-floating-point-values) – Fabio

Смежные вопросы