【问题标题】:sql - getting the count of employee in each grade in a specific formatsql - 以特定格式获取每个年级的员工人数
【发布时间】:2013-02-23 14:57:44
【问题描述】:

我是 sql 新手,我有一张这样的表

Emp_id | Emp_NAME | EMP_GRADE 1 测试1 A1 2 测试2 A2 3 测试3 A3 4 测试4 A4 6 测试5 A1 7 测试6 A2 8 测试7 A3

我需要计算每个年级的员工人数,最终的输出是 “2 - 2 - 2 - 1”在单列中,输出指的是(每个年级的员工人数,即 A1(2) - A2(2)- A3(2) -A4(1))。任何人都可以为此提供sql查询。我希望我们不需要光标。

【问题讨论】:

  • 哪个是 SQL Server 还是 Oracle?
  • coalesce 将为您工作。请参阅下面的答案。

标签: sql sql-server-2008


【解决方案1】:
SELECT COUNT(Emp_id) FROM myTableName GROUP BY EMP_GRADE

【讨论】:

    【解决方案2】:

    用途:

       DECLARE @Grades varchar(1000)
    
      SELECT @Grades=coalesce(@Grades + ' ','') +Cast(COUNT(EMP_GRADE) as Varchar(2))+' -'  From TableName 
      Group By EMP_GRADE
    
      Select @Grades=SUBSTRING(@Grades,0,LEN(@Grades))
      Select @Grades
    

    更新:

    SELECT @Grades=coalesce(@Grades + ' ','') +Cast(COUNT(t1.EMP_GRADE) as Varchar(2))+' -'  From @tab1 t
    Left Join @tab1 t1 On t1.EMP_GRADE= t.EMP_GRADE And  t1.Emp_id= t.Emp_id 
    And t1.EMP_GRADE<>'A3' -- Replace conditions here
    Group By t1.EMP_GRADE,t.EMP_GRADE
    

    【讨论】:

    • 感谢您的快速回复。我想要“2 - 2 - 2 - 1”而不是“T1(2) - T2(2) - T3(2) - T4(1)”
    • 非常感谢 ken clark .. 工作正常。对此有一个问题..如果我以某种条件过滤,说我有员工代码,该代码是唯一的,没有任何 A3 等级。如果我使用这个查询,它应该返回“2-2-0-1”,其中“0”表示当前选择没有等级
    • 抱歉,不清楚。能否请您粘贴您的确切情况。
    • 考虑我还有一个名为“EmployeeCode”的列是唯一的,并且“EmployeeCode”没有任何等级为“A3”的员工,那么如果我添加查询 SELECT @Grades=coalesce(@Grades + ' ','') +Cast(COUNT(EMP_GRADE) as Varchar(2))+' -' From TableName where EmployeeCode = 1 Group By EMP_GRADE 那么它应该返回“2-2-0-1”
    【解决方案3】:

    这应该可行:

    SELECT EMP_GRADE, COUNT(EMP_Id) AS EMPS_COUNT
    FROM TableName
    GROUP BY EMP_GRADE
    

    希望对您有所帮助。继续学习 SQL。

    【讨论】:

      【解决方案4】:
      SELECT STUFF((
        SELECT ' - ' + CAST(COUNT(1) AS VARCHAR(max)) 
        FROM myTable 
        GROUP BY EMP_GRADE 
        ORDER BY EMP_GRADE 
        FOR XML PATH('')
      ), 1, 3, '')
      

      SQL Fiddle example


      如果您正在过滤,但仍想返回每个成绩的结果,则需要自加入才能获得完整的成绩列表。这是一种方法:

      ;WITH g AS (SELECT DISTINCT EMP_GRADE FROM myTable)
      SELECT STUFF((
        SELECT ' - ' + CAST(COUNT(t.Emp_id) AS VARCHAR(max)) 
        FROM g
        LEFT OUTER JOIN myTable t ON g.EMP_GRADE = t.EMP_GRADE
            AND t.Emp_id % 2 = 1 --put your filter conditions here as part of the join
        GROUP BY g.EMP_GRADE
        ORDER BY g.EMP_GRADE
        FOR XML PATH('')
      ), 1, 3, '')
      

      SQL Fiddle example

      【讨论】:

      • 非常感谢我所需要的。对此有一个问题..如果我以某种条件过滤,说我有员工代码,该代码是唯一的,没有任何 A3 等级。如果我使用这个查询,它应该返回“2-2-0-1”,其中“0”表示当前选择没有等级
      • @premeclat 好的,我已经添加了一个如何做到这一点的示例。这假设您没有单独的 Grades 表。如果你这样做了,你可以从中选择而不是g
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多