如何通过子分组获取列数据

时间:2019-06-17 09:32:11

标签: sql sql-server tsql

我试图通过不同的状态明智地获取状态百分比,我们有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 个答案:

答案 0 :(得分:1)

您要按语句查找一个简单的分组:

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

答案 1 :(得分:0)

以下查询应执行您想要的操作,解决方案适用于SQL Server:

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

答案 2 :(得分:0)

msql的方式,别帮忙

SELECT
    MR_ID mrId,
    `Status` `Status`,
    count(DISTINCT `Status`) / count(*) * 100 per
FROM
    xxx
GROUP BY
    mrId, `Status`[enter image description here][1]

答案 3 :(得分:0)

您可以尝试以下方法:

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
;       

答案 4 :(得分:0)

我会简单地做:

response()->json()

如果要在单独的行而不是列中使用值,请使用窗口函数:

divs

这些查询是标准SQL,应在SQL Server和Oracle中都可以使用。