我无论如何都不是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。
非常感谢。
答案 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子句。