2013-04-02 87 views
0

我有这样显示结果的查询

SELECT TOP 100 PERCENT 
    COUNT(kodeall) AS Total, kodeall, kode, LEFT(kodeall, 1) AS kode1 
FROM 
    dbo.data 
WHERE 
    date BETWEEN '2013/03/01 00:00:00' AND '2013/03/01 23:59:00' 
    AND (kodeall IS NOT NULL) 
GROUP BY 
    kodeall, kode 
ORDER BY 
    kode1 

2个SQL查询和结果

Total l kodeall l kode l kode1 
2  1a   AA  1  
5  1d   BB  1   
2  2a   CC  2   
6  2d   DD  2   
1  2e   EE  2   
3  3a   FF  3   
2  3c   GG  3   
1  3f   WW  3  

查询#2:

SELECT  
    COUNT(kodeall) AS Sum, LEFT(kodeall, 1) AS kode1 
From 
    dbo.data 
WHERE 
    date BETWEEN '2013/03/01 00:00:00' 
    AND '2013/03/01 23:59:00' 
    AND (kodeall IS NOT NULL) 
GROUP BY 
    LEFT(kodeall, 1) 

和结果

Sum l kode1 l 
7  1  
9  2  
6  3  

和,如果我想显示的结果这样

Total l kodeall l kode l kode1 l sum l Percentage 
2  1a   AA  1  7  28.57 % 
5  1d   BB  1  7  71.43 % 
2  2a   CC  2  9  22.22 % 
6  2d   DD  2  9  66.66 % 
1  2e   EE  2  9  11.11 % 
3  3a   FF  3  6  50 % 
2  3c   GG  3  6  33.33 % 
1  3f   WW  3  6  16.67 % 

总和计kodeall通过在查询A. kode1

和百分比=合计/总和* 100 例2/7 * 100

请帮我

+2

欢迎StackOverflow上:如果您发布的代码,XML或数据样本,** **请在高亮文本编辑器这些线路上,并点击了的“代码示例”按钮('{}')编辑器工具栏以很好地格式化和语法突出显示它!这样,你不需要任何杂乱的'
'标签! –

+1

我是sory.thx您的信息。 – rian

回答

0

我认为你自己已经相当接近地回答了。我以SQL Server作为RDBMS为例。你的问题中没有提到RDBMS。
我使用两个CTE(公用表表达式)来保存你的两个查询,然后将它们连接在一起计算百分比,请注意,你最终结果中的百分比实际上是一个字符串。


;WITH CTE_TotalKodeall 
AS 
(
    SELECT TOP 100 PERCENT 
     COUNT(kodeall) AS Total, kodeall, kode, LEFT(kodeall, 1) AS kode1 
    FROM 
     dbo.data 
    WHERE 
     date BETWEEN '2013/03/01 00:00:00' AND '2013/03/01 23:59:00' 
     AND (kodeall IS NOT NULL) 
    GROUP BY 
     kodeall, kode 
    ORDER BY 
     kode1 
), CTE_SUMKodeall 
AS 
(
    SELECT  
    COUNT(kodeall) AS [Sum], LEFT(kodeall, 1) AS kode1 
    From 
    dbo.data 
    WHERE 
    date BETWEEN '2013/03/01 00:00:00' 
    AND '2013/03/01 23:59:00' 
    AND (kodeall IS NOT NULL) 
    GROUP BY 
    LEFT(kodeall, 1) 
) 
SELECT A.Total, A.kodeall, A.kode, A.kode1, B.[sum], 
     LEFT(cast((A.Total/(B.[SUM]*1.0) *100.0) as varchar(30)),5)+'%' as Percentage 
FROM CTE_TotalKodeall A 
JOIN CTE_SUMKodeall B 
ON A.kode1 = B.kode1 
+0

thx @ljh ... thx..hehe ..它的工作在SQL服务器2005年 – rian

+0

如何设置百分比与小数2位 – rian

+0

你的意思是你只是想显示74%,而不是74.13%?如果是这样,您需要使用ROUND()函数,如下所示:LEFT((CAST(ROUND((2 /(7 * 1.0)* 100.0),0)AS VARCHAR(30))),2)+'%' – ljh

0
SELECT TOP 100 PERCENT 
    COUNT(kodeall) AS Total, 
kodeall, kode, 
LEFT(kodeall, 1) AS kode1 , 
    sum1, 
    ((Count(kodeall)/sum1)* 100) As percentage 
FROM 
    dbo.data 
INNER JOIN 
(SELECT  
    COUNT(kodeall) AS Sum, 
LEFT(kodeall, 1) AS kode1 
    From 
    dbo.data 
    WHERE 
     date BETWEEN '2013/03/01 00:00:00' 
     AND '2013/03/01 23:59:00' 
     AND (kodeall IS NOT NULL) 
    GROUP BY 
    LEFT(kodeall, 1) 
) temp on temp.kode1 = dbo.data.kode1 

WHERE 
    date BETWEEN '2013/03/01 00:00:00' AND '2013/03/01 23:59:00' 
    AND (kodeall IS NOT NULL) 
    GROUP BY 
    kodeall, kode 
ORDER BY 
    dbo.data.kode1 
+0

关键字'WHERE'附近的语法错误。 – rian

+0

@rian尝试更新查询 – Dhinakar

0

这应该是相当接近(未经测试)

With cte1 as (
    SELECT COUNT(kodeall) AS Total, kodeall, kode, LEFT(kodeall, 1) AS kode1 
    FROM dbo.data 
    WHERE date >= '2013/03/01' AND date < '2013/03/02' 
     AND kodeall IS NOT NULL 
    GROUP BY kodeall, kode 
), cte2 as (
    SELECT COUNT(kodeall) AS Sum, LEFT(kodeall, 1) AS kode1 
    From dbo.data 
    WHERE date >= '2013/03/01' AND date < '2013/03/02' 
     AND kodeall IS NOT NULL 
    GROUP BY LEFT(kodeall, 1) 
) 
SELECT c1.Total, c1.kodeall, c1.kode, c1.kode1, 
    c2.sum, c1.Total/c2.sum percentage 
FROM cte1 c1 
    JOIN cte2 c2 ON c1.kode1 = c2.kode1 

请小心使用BETWEEN,特别是日期字段。我会使用大于或小于。

+0

什么是c1和c2 – rian

+0

@rian - 这些只是别名 - 比输入整个表/ cte名称更容易。你可以使用列和表:)别名 – sgeddes