【问题标题】:SQL Query to return 2 results for multiple employeesSQL 查询为多个员工返回 2 个结果
【发布时间】:2016-07-11 21:07:50
【问题描述】:

我对 SQL 很陌生,事实上,我完全是自学成才的。我目前在下面有这个查询,它可以找到(非常糟糕)员工的 2 张随机支持票。

现在,查询将询问员工姓名并提供 2 个结果。有没有办法让这为所有员工提供 2 个结果?

SELECT
        TOP 2 CONVERT (
            DATE,
            SD_REQUEST.END_DATE_UT
        ) AS 'Close Date',
        SD_REQUEST.RFC_number AS 'Ticket',
        agent.LAST_NAME AS 'Agent',
        AM_DOMAIN.NAME_EN AS 'Company',
        EE.LAST_NAME AS 'Recipient',
        RR.LAST_NAME AS 'Requestor',
        catpath.SD_CATALOG_PATH_EN
    FROM
        SD_REQUEST
    LEFT JOIN AM_EMPLOYEE AS agent ON agent.EMPLOYEE_ID = SD_REQUEST.OWNER_ID
    LEFT JOIN AM_EMPLOYEE AS EE ON EE.EMPLOYEE_ID = SD_REQUEST.RECIPIENT_ID
    LEFT JOIN AM_EMPLOYEE AS RR ON RR.EMPLOYEE_ID = SD_REQUEST.REQUESTOR_ID
    LEFT JOIN SD_CATALOG_PATH AS catpath ON catpath.SD_CATALOG_ID = SD_REQUEST.SD_CATALOG_ID
    LEFT JOIN AM_DOMAIN ON AM_DOMAIN.DOMAIN_ID = EE.DEFAULT_DOMAIN_ID
    WHERE
        agent.LAST_NAME = 'insert name here'
    AND CONVERT (
        datetime,
        SD_REQUEST.END_DATE_UT,
        101
    ) BETWEEN (Getdate() - 8)
    AND (Getdate() - 2)
    ORDER BY
        NEWID()

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?问题标记为 MySQL。
  • 删除 agent.LAST_NAME = 'insert name here' AND 它会给你一切。

标签: sql sql-server navicat


【解决方案1】:

我假设您正在使用基于相关语法的 SQL Server。您可以在 cte/子查询中使用 ROW_NUMBER() 函数为每一行生成一个数字,使用 PARTITION BY 您可以为给定集合/组的每个成员重新开始编号,在本例中为 agent.LAST_NAME,您可以使用该数字将每个集合/组限制为两个结果:

;with cte AS (
        SELECT  CONVERT (DATE,SD_REQUEST.END_DATE_UT) AS 'Close Date',
                SD_REQUEST.RFC_number AS 'Ticket',
                agent.LAST_NAME AS 'Agent',
                AM_DOMAIN.NAME_EN AS 'Company',
                EE.LAST_NAME AS 'Recipient',
                RR.LAST_NAME AS 'Requestor',
                catpath.SD_CATALOG_PATH_EN,
                ROW_NUMBER() OVER(PARTITION BY agent.LAST_NAME ORDER BY NEWID()) AS RN
            FROM
                SD_REQUEST
            LEFT JOIN AM_EMPLOYEE AS agent ON agent.EMPLOYEE_ID = SD_REQUEST.OWNER_ID
            LEFT JOIN AM_EMPLOYEE AS EE ON EE.EMPLOYEE_ID = SD_REQUEST.RECIPIENT_ID
            LEFT JOIN AM_EMPLOYEE AS RR ON RR.EMPLOYEE_ID = SD_REQUEST.REQUESTOR_ID
            LEFT JOIN SD_CATALOG_PATH AS catpath ON catpath.SD_CATALOG_ID = SD_REQUEST.SD_CATALOG_ID
            LEFT JOIN AM_DOMAIN ON AM_DOMAIN.DOMAIN_ID = EE.DEFAULT_DOMAIN_ID
        WHERE  CONVERT (datetime,SD_REQUEST.END_DATE_UT,101) BETWEEN (Getdate() - 8) AND (Getdate() - 2)
        )
SELECT *
FROM cte
WHERE RN <= 2

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2010-09-25
    • 2020-10-23
    • 2020-11-25
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多