2015-04-08 314 views
0

SQL中是否有可能计算该用户订单总数(RequestedBy)中“StaffEntered”列的“是”值(计算列的情况)的百分比?我现在基本上是在使用Pivot表格的Excel中自己完成这个功能,但是认为将它构建到查询中可能更容易。下面是现有的样本SQL代码:SQL百分比计算

Select 
    Distinct 

    RequestedBy = HStaff.Name, 
    AccountID = isnull(pv.AccountID, ''), 
    StaffEntered = Case When DictionaryItem2.Name like '%PLB%' Then 'Yes' Else 'No' end 


FROM 
[dbo].[HOrd] HOrd WITH (NOLOCK) 
left outer join HStaff HStaff with (nolock) 
    on HOrd.Requestedby_oid = HStaff.ObjectID 
    and HStaff.Active = 1 
left outer join DictionaryItem DictionaryItem2 WITH (NOLOCK) 
    ON HSUser1.PreferenceGroup_oid = DictionaryItem2.ObjectID 
    AND DictionaryItem2.ItemType_oid = 98 

下面是我在做什么在Excel中当前与查询结果,我有一个数据透视表,我出除以“StaffEntered”场“是”值该特定“RequestedBy”用户的总条目总数。基本上Excel是做汇总,然后我做一个简单的除法计算来获得百分比。

enter image description here

提前感谢!

回答

1

你没有提供很多细节的方式,但我认为这应该非常接近你正在寻找的东西。

select HStaff.Name as RequestedBy 
    , isnull(pv.AccountID, '') as AccountID 
    , Case When DictionaryItem2.Name like '%PLB%' Then 'Yes' Else 'No' end as StaffEntered 
    , sum(Case When DictionaryItem2.Name like '%PLB%' Then 1 Else 0 end)/GrandTotal 
From SomeTable 
group by HStaff.Name 
    , isnull(pv.AccountID, '') 
    , GrandTotal 
+0

GrandTotal是不是在我的查询中的列,它是一个Excel数据透视表中的字段。我需要为每个用户(工作人员姓名)逐行添加总数。 – Nick

+0

我不知道你是什么意思。它是每个用户的行数吗?一些其他列的总和。无论如何,这很可能只是某种形式的聚合。它看起来也许只是数(*),但我不能说清楚。 –

0

给出您的SQL语句的FROM部分将允许我们创建一个更正确的答案。该声明将得到的是/否每HStaff名的总和,它在你的SQL语句添加到每个细节记录:

WITH cte 
      AS (SELECT HStaff.Name , 
         SUM(CASE WHEN dictionaryItem2.Name LIKE '%PLB%' THEN 1 
           ELSE 0 
          END) AS YesCount , 
         SUM(CASE WHEN dictionaryItem2.Name NOT LIKE '%PLB%' 
           THEN 1 
           ELSE 0 
          END) AS NotCount 
       FROM  YourTable 
       GROUP BY HStaff.Name 
      ) 
    SELECT HStaff.Name AS requestedBy , 
      ISNULL(pv.AccountID, '') AS AccountID , 
      CASE WHEN DictionaryItem2.Name LIKE '%PLB%' THEN 'Yes' 
       ELSE 'No' 
      END AS StaffEntered , 
      cte.YesCount/(cte.YesCount + cte.NotCount) AS PLB_Percentage 
    FROM yourtable 
      INNER JOIN cte ON yourtable.Hstaff.Name = cte.NAME 
+0

感谢您的反馈。我已经添加了上面的FROM子句,不知道这将如何改变你的建议答案..? – Nick