【问题标题】:SQL Percentage calculationSQL 百分比计算
【发布时间】:2015-04-08 14:47:15
【问题描述】:

是否可以在 SQL 中计算“StaffEntered”列的“是”值(计算列时的情况)占该用户 (RequestedBy) 的总订单数的百分比?我现在基本上是在 Excel 中使用数据透视表执行此功能,但认为将其构建到查询中可能更容易。这是现有的示例 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 是在做总结,然后我做一个简单的除法计算来获得百分比。

提前致谢!

【问题讨论】:

    标签: sql-server pivot-table


    【解决方案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
    

    【讨论】:

    • GrandTotal 不是我查询中的列,它是 Excel 数据透视表字段。我需要每个用户(员工姓名)的总行数。
    • 我不明白你的意思。它是每个用户的行数吗?其他一些列的总和。不管怎样,它很可能只是某种聚合。看起来可能只是 count(*) ,但我不太清楚。
    【解决方案2】:

    提供 SQL 语句的 FROM 部分将使我们能够创建更正确的答案。此语句将获取每个 HStaff 名称的 yes/no 总数,并将其添加到 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
    

    【讨论】:

    • 感谢您的反馈。我在上面添加了 FROM 子句,不知道这会如何改变你建议的答案..?
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2021-12-17
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多