0

我有一个 sql 查询来返回 IT 票及其满意度分数,但是由于我们的票务系统的工作方式,有时会返回 2 行作为票证参考 - 1 行具有“未评级”评级,另一行具有真实评级。

我的问题是,有没有办法让查询只为每个票证参考返回一行,如果另一个评级不存在,则只返回“未评级”评级。即,当有 2 行具有相同的票证参考并且一个具有“优秀”评级和一个具有“未评级”评级时,它只返回具有“优秀”评级的行。应返回只有 1 行“未评级”的任何内容。

到目前为止,查询看起来像这样 -

SELECT DISTINCT
    t.Rating_Date,
    t.id AS 'Ticket Reference',
    [Rating]
            = CASE
            When tt.[rating_id] = 20 then 'Poor'
            When tt.[rating_id] = 15 then 'Average'
            When tt.[rating_id] = 17 then 'Good'
            When tt.[rating_id] = 6 then 'Excellent'
            else 'Not Rated'
            END,
    [subject],
    [priority],
    [status],
    uu.name,
    [assignee_id],
    [Location],
    [technology]

FROM 
    [DB1].[dbo].[table1] t

    INNER JOIN  [DB1].[dbo].[table2] tt 
                ON t.id=tt.ticket_id

    LEFT JOIN   [DB1].[dbo].[table3] uu 
                ON t.assignee_id=uu.id

WHERE 
    t.rating_date > '2013-07-01'
    AND status = 'closed'
    AND location = 'UK'
    AND technology <> 'Not Known'
    AND group_id = '5678912'

ORDER BY 
    t-rating_date
4

2 回答 2

0

我想下面的逻辑可以在这里实现。请注意,我正在使用示例数据,为了实施解决方案,您应该了解这个想法。

假设我们有以下数据:

在此处输入图像描述

注意:我将 id "0" 用于“未评级”状态。

如果我正确理解了您的需求,输出数据应该是这样的:

在此处输入图像描述

从上面的屏幕截图中可以看出,对于 ID 为 1 和 4 的工单,我们有“未评级”记录,但我们没有显示它们。仅 ID 为 3 的工单显示“未评级”状态。

解决方案:

;WITH DataSource  AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY [TicketID] ORDER BY [TicketRateID] DESC) AS [RowNumber]
          ,[TicketID]
          ,[TicketRateID]
    FROM @DataSource

)
SELECT [TicketID]
      ,[RowNumber]
      ,[TicketRateID]
FROM DataSource

上面的 SQL 语句使用ROW_NUMBER函数来为给定票证的每组记录创建一个唯一 ID。我们使用 DESC 指令对记录进行排序,以确保“0”/“未评级”记录具有更大的 ID。

上一条语句的输出是:

在此处输入图像描述

从上面的屏幕截图中可以看出,我们只需要显示 RowNumber 等于 1 的记录。这很简单,只需使用 WHERE 子句即可。

以下是完整的工作示例:

SET NOCOUNT ON
GO

    DECLARE @DataSource TABLE
    (
         [TicketID] TINYINT
        ,[TicketRateID] TINYINT
    )

    INSERT INTO @DataSource ([TicketID],[TicketRateID])
    VALUES (1,6)
          ,(1,0)
          ,(2,20)
          ,(3,0)
          ,(4,0)
          ,(4,15)


    ;WITH DataSource  AS
    (
        SELECT ROW_NUMBER() OVER (PARTITION BY [TicketID] ORDER BY [TicketRateID] DESC) AS [RowNumber]
              ,[TicketID]
              ,[TicketRateID]
        FROM @DataSource

    )
    SELECT [TicketID]
          ,[RowNumber]
          ,[TicketRateID]
    FROM DataSource
    WHERE [RowNumber] = 1  

SET NOCOUNT OFF
GO
于 2013-09-13T07:39:01.807 回答
0

我认为您可以包装第一个查询,对其进行排序rating_id(如果Not rating值为 0,则应订购DESC,如果Not rating为最高,则应订购ASC),然后使用sql-server的TOP功能选择第一条记录。

于 2013-09-13T07:16:26.763 回答