2015-12-23 104 views
3

这是我的数据库表:遍历行和计数基于表名

Status 
------ 
Active 
Active 
Inactive 
Removed 
Removed 

我想要的输出:

Status | Total | Percent 
------------------------------- 
Active | 2 | 33.33 
Inactive | 1 | 16.66 
Removed | 3 | 50 
Total | 6 | 100 

我已经尝试:

SELECT 
    OrderStatus AS Status, 
    COUNT(OrderStatus) AS Total, 
    ROUND(((COUNT(OrderStatus) * 100)/COUNT(*)),2) AS Percent 
FROM 
    myTable 

对于显而易见的原因,我的查询不工作,任何帮助赞赏!

+0

如果接入载体衍生的表,如'SELECT * FROM(SELECT字段从表,其中1 = 2)derivedTable'然后这是你应该采取的方法。 –

回答

3

你错过了group by子句,并且你需要的记录总数,你可以使用子查询得到划分:

SELECT 
    OrderStatus AS Status, 
    COUNT(OrderStatus) AS Total, 
    ROUND((COUNT(OrderStatus) * 100)/(select COUNT(*) from myTable),2) AS [Percent] 
FROM 
    myTable 
Group by OrderStatus 
+1

这将返回100%的所有行 –

+1

啊...我错过了原始查询的问题。更新了我的答案。 –

+0

@BrianPressler会不会将总数计入一个变量中,以便它不需要重复计算? –

0

表中的总记录分配给一个变量。这将防止它需要为每条记录重新计算。只有5条记录的小问题,但是如果您将此逻辑应用于具有更多唯一值的较大表格,则差异应该变得明显。

SQL:

declare @TempTable table([OrderStatus] varchar(50)) 

insert into @TempTable 
values 
('Active'), 
('Active'), 
('Inactive'), 
('Removed'), 
('Removed') 

DECLARE @TotalRecords int = (Select Count(*) from @TempTable) 

SELECT 
    OrderStatus AS Status, 
    COUNT(OrderStatus) AS Total, 
    ROUND((COUNT(OrderStatus) * 100)/@TotalRecords,2) AS [Percent] 
FROM 
    @TempTable 
Group by OrderStatus 

结果:

(5 row(s) affected) 
Status            Total  Percent 
-------------------------------------------------- ----------- ----------- 
Active            2   40 
Inactive           1   20 
Removed           2   40 

(3 row(s) affected)