获取 Sql-Server 中逗号分隔值中未分组列的详细信息

Posted

技术标签:

【中文标题】获取 Sql-Server 中逗号分隔值中未分组列的详细信息【英文标题】:Get details of ungrouped columns in comma separated values in Sql-Server 【发布时间】:2020-02-11 16:55:48 【问题描述】:

我想获取所有三个表详细信息的 lvdays 总和大于 30 的员工休假。找不到解决办法。

员工:

empcode| MNGR_CODE| MNGR_CODE2
-------|----------|-----------
AA     |   bb     |     cc 
FF     |   bb     |     cc

lvtype:

typeid| desc
------|---------
1     | casual

离开:

leaveid| empcode| lvdays| typeid| Flag| date      | reason 
-------|--------|-------|-------|-----|-----------|---------
1      |  AA    | 2     |    1  |  1  | 11-02-2020| NULL 
2      |  AA    | 3     |    1  |  1  | 02-11-2019| NULL
3      |  FF    | 4     |    1  |  1  | 23-12-2019| NULL

这是我正在尝试构建但无法实现目标的查询。

SELECT MNGR_CODE,
       MNGR_CODE2,
       lt.desc,
       l.reason,
       l.leaveID
FROM Leave l
     INNER JOIN lvtype lt ON l.typeid = lt.typeid
     LEFT OUTER HASH JOIN employee em ON em.Emp_Code = l.empcode
WHERE empcode IN ('AA', 'FF')
  AND leaveID IN (SELECT leaveID
                  FROM Leave l
                       INNER JOIN lvtype lt ON l.typeid = lt.typeid
                  WHERE l.empcode IN ('AA', 'FF')
                  GROUP BY l.empcode
                  HAVING SUM(lvdays) > 30);

【问题讨论】:

仅供参考 DESC 是 SQL Server 中的保留关键字。创建对象时最好避免使用保留字,如果确实有保留字,则必须引用它们。如果不这样做,您的代码将出错。在这种情况下,上面实际上会产生错误Incorrect syntax near the keyword 'desc'. 换个说法,为什么LEFT OUTER HASH JOIN employee em 中有HASH?为什么LEFT JOINWHERE 中的隐含INNER JOINempcode IN ('AA', 'FF')? 【参考方案1】:

如果我没看错,你可以使用窗口函数:

select *
from (
    select 
        e.mngr_code,
        e.mngr_code2,
        lt.desc, 
        l.reason,
        l.leaveid,
        sum(l.lvdays) over(partition by e.empcode) sum_lvdays
    from leave l 
    inner join lvtype lt on l.typeid = lt.typeid 
    inner join employee em on em.emp_code = l.empcode
) t
where sum_lvdays > 30

子查询基于您现有的查询,并添加了一个附加列,该列对每个员工的所有休假进行窗口总和。外部查询使用窗口求和的结果作为过滤器。

我不确定您在子查询中是否需要 left join,因此我将其更改为 inner join

【讨论】:

以上是关于获取 Sql-Server 中逗号分隔值中未分组列的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

从逗号分隔的值中查询结果并查询要显示的每个值

SQL Server 逗号分隔列到多列

SQL 内连接和分组依据以获取逗号分隔值

如何在 Oracle 中修剪逗号分隔值中的前导零?

SQL 从 XML 中获取列的逗号分隔值

计算列逗号分隔值 oracle