Как получить данные столбца по подгруппам - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь получить процент статуса по разным статусам, и у нас есть 4 типа статуса. Вот данные для столбцов ниже.

MR_ID Sup_ID    Status

1   1   Rejected    
1   1   Accepted    
1   1   Accepted    
1   1   Rejected    
2   2   InProgress  
2   2   InProgress  
2   2   Accepted    
2   2   Fordwarded  

Как и для комбинации MR_ID: 1 и Sup_ID: 1,% «Принято» - 50%, а% «Отклонено» - 50%

Нужно написать запрос SQL или хранимую процедуру, чтобы найти его на сервере SQL

Понятия не имею.

Ответы [ 5 ]

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

Вы ищете простую группу по утверждению:

SELECT 
    MR_ID,
    Sup_ID,
    (CAST(SUM(CASE WHEN [Status] ='InProgress' THEN 1 ELSE 0 END) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) * 100 'InProgress',
    (CAST(SUM(CASE WHEN [Status] ='Fordwarded' THEN 1 ELSE 0 END) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) * 100 'Fordwarded',
    (CAST(SUM(CASE WHEN [Status] ='Accepted' THEN 1 ELSE 0 END) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) * 100 'Accepted',
    (CAST(SUM(CASE WHEN [Status] ='Rejected' THEN 1 ELSE 0 END) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) * 100 'Rejected'
FROM 
    @Table1 t
GROUP BY 
    MR_ID,
    Sup_ID

Результат:

enter image description here

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

Я бы просто сделал:

select mr_id, sup_id,
       avg(case when status = 'Accepted' then 1.0 else 0 end) as ratio_accepted,
       avg(case when status = 'Rejected' then 1.0 else 0 end) as ratio_rejected,
       avg(case when status = 'InProgress' then 1.0 else 0 end) as ratio_inprogress,
       avg(case when status = 'Forwarded' then 1.0 else 0 end) as ratio_forwarded
from t
group by mr_id, sup_id;

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

select mr_id, sup_id, status,
       count(*) * 1.0 / sum(count(*)) over (partition by mr_id, sub_id) as ratio
from t
group by mr_id, sup_id, status;

Эти запросы являются стандартным SQL и должны работатькак в SQL Server, так и в Oracle.

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

Вы можете попробовать это:

CREATE TABLE TMP_PERC(
FIELD1 INT NOT NULL
, FIELD2 INT NOT NULL
, DESCR VARCHAR (100) NOT NULL
)


INSERT INTO TMP_PERC VALUES(1, 1, 'Rejected');
INSERT INTO TMP_PERC VALUES(1, 1, 'Accepted');
INSERT INTO TMP_PERC VALUES(1, 1, 'Accepted');
INSERT INTO TMP_PERC VALUES(1, 1, 'Rejected');
INSERT INTO TMP_PERC VALUES(2, 2, 'InProgress');
INSERT INTO TMP_PERC VALUES(2, 2, 'InProgress');
INSERT INTO TMP_PERC VALUES(2, 2, 'Accepted');
INSERT INTO TMP_PERC VALUES(2, 2, 'Fordwarded');

SELECT FD.FIELD1
     , FD.FIELD2
     , FD.DESCR
     , CAST(FD.TOTAL_DESCR AS FLOAT) / CAST(FC.TOTAL  AS FLOAT) * 100 AS PERC
FROM
(
SELECT FIELD1
     , FIELD2
     , DESCR
     , COUNT(*) AS TOTAL_DESCR   
FROM TMP_PERC TP_DECSCR
GROUP BY FIELD1
       , FIELD2
       , DESCR
) FD
INNER JOIN
(

SELECT FIELD1
     , FIELD2
     , COUNT(*) AS TOTAL
FROM TMP_PERC
GROUP BY FIELD1
       , FIELD2
) FC             
ON FD.FIELD1 = FC.FIELD1
AND FD.FIELD2 = FC.FIELD2
;       
0 голосов
/ 17 июня 2019

msql, не знаю, помогло ли это

SELECT
    MR_ID mrId,
    `Status` `Status`,
    count(DISTINCT `Status`) / count(*) * 100 per
FROM
    xxx
GROUP BY
    mrId, `Status`[enter image description here][1]
0 голосов
/ 17 июня 2019

Следующий запрос должен делать то, что вы хотите, решение для сервера SQL:

CREATE TABLE #temp (MR_ID INT, Sup_ID INT, [Status] VARCHAR(20))

INSERT INTO #temp VALUES
(1,1,'Rejected'),
(1,1,'Accepted'), 
(1,1,'Accepted'), 
(1,1,'Rejected'), 
(2,2,'InProgress'), 
(2,2,'InProgress'),
(2,2,'Accepted'),
(2,2,'Fordwarded') 

SELECT t.MR_ID, t.Sup_ID, t.[Status], (COUNT(t.[Status]) * 100 / (SELECT COUNT(*) FROM #temp WHERE MR_ID = t.MR_ID AND Sup_ID = t.Sup_ID )) AS [Percentage]
FROM #temp t
GROUP BY MR_ID, Sup_ID, [Status]

Результат как ниже,

MR_ID   Sup_ID  Status      Percentage
1       1       Accepted    50
1       1       Rejected    50
2       2       Accepted    25
2       2       Fordwarded  25
2       2       InProgress  50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...