SQL:使用聚合函数获取百分比的查询有问题

时间:2010-08-11 20:12:20

标签: sql sql-server tsql sql-server-2005

我无论如何都不是SQL方面的专家,而且很难从查询中获取所需的数据。我正在使用单个表,Journal_Entry,它有许多列。一列是Status_ID,它是Status表的外键,其中三个值为“Green”,“Yellow”和“Red”。此外,还会针对特定用户(User_ID)记录日记帐分录。

我正在尝试获取每个状态记录的日记帐分录数,占特定用户记录的日记帐分录总数的百分比。到目前为止,我已经得到以下状态为1,这是绿色的(我知道这不起作用):

SELECT  CAST((SELECT COUNT(Journal_Entry_ID) 
        FROM Journal_Entry 
        WHERE Status_ID = 1 AND User_ID = 3 / 
        SELECT COUNT(Journal_Entry_ID) 
        FROM Journal_Entry AND User_ID = 3)) AS FLOAT * 100

我需要继续查询其他两个状态ID,2和3,理想情况下,最后选择三列作为百分比,每个状态一个:“Green_Percent”,“Yellow_Percent”和“ Red_Percent”。

这可能是我曾经问过的最脱节的问题,所以我为任何不清楚而道歉。我很乐意在必要时澄清。另外,我正在使用SQL Server 2005。

非常感谢。

3 个答案:

答案 0 :(得分:2)

使用:

  SELECT je.statusid,
         COUNT(*) AS num,
         (COUNT(*) / (SELECT COUNT(*)+.0
                       FROM JOURNAL_ENTRY) ) * 100
    FROM JOURNAL_ENTRY je
GROUP BY je.statusid

然后是格式化你想要的精度的问题:

CAST(((COUNT(*) / (SELECT COUNT(*)+.0 FROM BCCAMPUS.dbo.COURSES_RFIP)) * 100)
     AS DECIMAL(4,2))

...会给出两位小数。如果您不想要任何小数位,请将结果转换为INT。

您可以使用CTE来最小化重复:

WITH cte AS (
   SELECT je.*
     FROM JOURNAL_ENTRY je
    WHERE je.user_id = 3)
  SELECT c.statusid,
         COUNT(*) AS num,
         (COUNT(*) / (SELECT COUNT(*)+.0
                       FROM cte) ) * 100
    FROM cte c
GROUP BY c.statusid

答案 1 :(得分:0)

DECLARE @JournalEntry TABLE
(   StatusID        INT
);
INSERT INTO @JournalEntry (StatusID) VALUES
    (1), (1),(1),(1),(1),(1),(1)
   ,(2), (2),(2),(2),(2),(2),(2)
   ,(3), (3),(3),(3),(3),(3),(3);

 SELECT 
 CAST(SUM(CASE WHEN StatusID = 1 THEN 1 ELSE 0 END) AS DECIMAL) / CAST(COUNT(*) AS DECIMAL) Green
,CAST(SUM(CASE WHEN StatusID = 2 THEN 1 ELSE 0 END) AS DECIMAL) / CAST(COUNT(*) AS DECIMAL) Yellow
,CAST(SUM(CASE WHEN StatusID = 3 THEN 1 ELSE 0 END) AS DECIMAL) / CAST(COUNT(*) AS DECIMAL) Blue
 FROM @JournalEntry;

答案 2 :(得分:0)

这应该有效:

SELECT
    user_id,
    (CAST(SUM(CASE WHEN status_id = 1 THEN 1 ELSE 0 END) AS DECIMAL(6, 4))/COUNT(*)) * 100 AS pct_green,
    (CAST(SUM(CASE WHEN status_id = 2 THEN 1 ELSE 0 END) AS DECIMAL(6, 4))/COUNT(*)) * 100 AS pct_yellow,
    (CAST(SUM(CASE WHEN status_id = 3 THEN 1 ELSE 0 END) AS DECIMAL(6, 4))/COUNT(*)) * 100 AS pct_red
FROM
    Journal_Entry
WHERE
    user_id = 1
GROUP BY
    user_id

如果您不需要返回user_id,那么只要您只返回一个用户的数据(或者您想要WHERE子句中所有用户的聚合),您就可以摆脱它和GROUP BY子句)。如果你想为每个用户提供它,那么你可以保留GROUP BY并简单地删除WHERE子句。