tansx 2025-08-09 16:31 采纳率: 50%
浏览 6
已结题

求MSSQL查询语句

MSSQL表:
姓名 出勤情况 次数
A 迟到 2
A 早退 1
A 旷工 3
B 迟到 1
B 早退 4

求从上表中查询下面结果的SQL语句
姓名 迟到 早退 旷工
A 2 1 3
B 1 4

  • 写回答

5条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-08-09 16:33
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 需求是对给定的MSSQL表进行查询操作,可能需要统计不同姓名的各种出勤情况及次数等信息。
    2. 解决方案:
      - 例如要统计每个姓名的迟到、早退、旷工次数,可以使用如下查询语句:
    SELECT 姓名,
           SUM(CASE WHEN 出勤情况 = '迟到' THEN 次数 ELSE 0 END) AS 迟到次数,
           SUM(CASE WHEN 出勤情况 = '早退' THEN 次数 ELSE 0 END) AS 早退次数,
           SUM(CASE WHEN 出勤情况 = '旷工' THEN 次数 ELSE 0 END) AS 旷工次数
    FROM 表名
    GROUP BY 姓名;
    
    • 假设表名为attendance_table,上述代码中使用CASE语句来根据不同的出勤情况进行条件判断,并对相应的次数进行求和,最后通过GROUP BY按姓名进行分组统计。
      3. 多种解决方案及优缺点:
    • 使用PIVOT操作
      • 优点:可以更直观地将数据转换为列形式展示不同出勤情况的次数。
      • 缺点:语法相对复杂,对于复杂的条件处理可能不太灵活。
      • 示例代码
    SELECT *
    FROM (
           SELECT 姓名, 出勤情况, 次数
           FROM attendance_table
         ) AS SourceTable
    PIVOT (
           SUM(次数)
           FOR 出勤情况 IN ([迟到], [早退], [旷工])
         ) AS PivotTable;
    
    • 使用动态SQL
      • 优点:可以根据表中实际存在的出勤情况动态生成查询语句,更具通用性。
      • 缺点:编写和维护动态SQL较为复杂,容易出现语法错误和安全问题。
      • 示例代码(简单示意)
    DECLARE @cols NVARCHAR(MAX);
    DECLARE @query NVARCHAR(MAX);
    
    SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(出勤情况)
                          FROM attendance_table
                          FOR XML PATH('')), 1, 1, '');
    
    SET @query = 'SELECT 姓名,' + @cols +'FROM (
                   SELECT 姓名, 出勤情况, 次数
                   FROM attendance_table
                 ) AS SourceTable
                 PIVOT (
                   SUM(次数)
                   FOR 出勤情况 IN (' + @cols + ')
                 ) AS PivotTable';
    
    EXEC sp_executesql @query;
    
    1. 总结:
      - 对于统计不同姓名的各种出勤情况及次数,常用的方法是使用GROUP BY结合CASE语句进行条件求和。PIVOT操作可以使数据呈现更直观,但语法复杂。动态SQL则更具通用性,但编写难度较大。具体使用哪种方法应根据实际需求和场景来选择。

    请注意,以上代码中的表名attendance_table表名需要根据实际的表名进行替换。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月18日
  • 已采纳回答 8月10日
  • 创建了问题 8月9日