如何在SQL中以水平行为基础计算百分比

时间:2018-03-25 04:08:29

标签: sql sql-server tsql

我有一个表,根据对url的查询,存储特定文章获取的所有打印件。因此,例如,每当用户阅读articles.aspx?artid = 1中的文章时,它将再存储一行,包括文章的ID,用户的IP地址,日期和时间以及URL引用。

我有一个SQL咨询,它会告诉我上个月查看文章的次数,它还会告诉我总观看次数和独特观看次数(基于不同用户的IP) )。

这是SQL代码:

BlogId  Titulo                  Print   Unicas      TasaImp     TasaImpUnicas
--------------------------------------------------------------------------------
1       Art. 1                  20      7           8.97%       3.14%
2       Art. 2                  20      6           8.97%       2.69%
3       Art. 3                  9       5           4.04%       2.24%
4       Art. 4                  17      5           7.62%       2.24%
5       Art. 5                  155     113         69.51%      50.67%
8       Art. 6                  2       1           0.90%       0.45%

这将带回这张桌子:

(Unicas / Print) * 100

我需要一个咨询,让我通过这个操作来计算真实的讲课率:

BlogId  Titulo  Print   Unicas  TasaImp TasaImpUnicas   LecturaReal
--------------------------------------------------------------------
1       Art. 1  20      7       8.97%   3.14%           35.00%
2       Art. 2  20      6       8.97%   2.69%           35.00%
3       Art. 3  9       5       4.04%   2.24%           55.56%
4       Art. 4  17      5       7.62%   2.24%           29.41%
5       Art. 5  155     113     69.51%  50.67%          72.90%
8       Art. 6  2       1       0.90%   0.45%           50.00%

这样表就是这样的:

(COUNT(DISTINCT([dbo].[Blog_Stats].[UsrIp])) / COUNT(*)) * 100 AS [LecturaReal]

我已经尝试将此行添加到SQL Consult:

 item["oracle_order_number"] = "";
 item["oracle_response_message"]="";
 item["oracle_response_status"]="";
 this.props.publishToOracleEBS(item);

但它将返回该列中0的所有记录。

提前感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:2)

您的计算问题是整数除法。如果您使用表别名,您的查询将更容易理解:

SELECT s.BlogId, p.Titulo, COUNT(*) AS [Print],
        COUNT(DISTINCT s.UsrIp) AS Unicas,
        CONVERT(varchar(10),
                CONVERT(numeric(18, 2), COUNT(*) * 100.0 / @total_prints
                       )
               ) + '%' AS TasaImp,
        CONVERT(varchar(10),
                CONVERT(numeric(18, 2), COUNT(DISTINCT s.[UsrIp]) * 100.0 / @total_prints
                       )
              ) + '%' AS TasaImpUnicas,
         COUNT(DISTINCT s.UsrIp) * 100.0 / COUNT(*) AS [LecturaReal]
FROM dbo.Blog_Stats s INNER JOIN
     dbo.Blog_Post p
     ON p.ID = s.BlogId
WHERE s.FechaPrint BETWEEN @f1 AND @f2
GROUP BY s.BlogId, p.Titulo;

注意:

  • 表别名使查询更容易编写。
  • 没有必要逃避所有名字。这只会使查询更难写和阅读。
  • DISTINCT不是函数,因此将以下表达式括在括号中会产生误导。
  • 乘以100.0是避免整数除法的便捷方法。