【问题标题】:SQL Display Distinct records and include a field if certain data is foundSQL 显示不同的记录并在找到某些数据时包含一个字段
【发布时间】:2015-02-24 21:30:25
【问题描述】:

我想要完成的是显示不同的数据,但如果特定行有特定数据,还会在每行上显示一个字段。

让我感到困惑的是,我仍然需要它是不同的,如果我尝试进行另一个连接,我会得到更多的行..

我只是希望保留我正在检索的相同结果,但有一个额外的列告诉我 - 该设备(行)需要维修,因为它的至少一个属性如此说明......希望这是有道理的,不确定如果我在这里清楚地解释自己。

主表(检查表)

在上表中,注意FK_Sequence每个条目大约有17个,用户需要回答OK或REPAIR(这是FK_Status

我当前的查询如下,结果只是一个员工和他们工作的设备。

SELECT DISTINCT
            a.EnteredDate,
            bb.EmployeeId,
            bb.EmployeeName,
            dd.EquipmentId,
            dd.EquipmentName

            FROM dbo.PIT_Inspection a

            INNER JOIN dbo.EmployeeName bb
            ON a.FK_EmployeeName = bb.PK_EmployeeName

            INNER JOIN dbo.EquipmentName dd
            ON a.FK_EquipmentName = dd.PK_EquipmentName

以上查询结果:

但是这就是我的问题所在。请注意主表 - 第 19 行的 2FK_Status .. 我想在表的附加列中检测到这一点,并针对这个特定的员工显示器修复以上命名为StatusName

【问题讨论】:

  • 在选择列表中使用相关子查询。

标签: sql sql-server tsql


【解决方案1】:

你可以通过使用GROUP BY而不是DISTINCT来做到这一点,然后你可以使用条件计数来查看有多少行的状态为2,如果多于无则显示REPAIR

SELECT  a.EnteredDate,
        bb.EmployeeId,
        bb.EmployeeName,
        dd.EquipmentId,
        dd.EquipmentName,
        StatusName = CASE WHEN COUNT(CASE WHEN a.FK_Status = 2 THEN 1 END) > 0 
                            THEN 'REPAIR' 
                            ELSE '' 
                        END
FROM dbo.PIT_Inspection a

INNER JOIN dbo.EmployeeName bb
ON a.FK_EmployeeName = bb.PK_EmployeeName

INNER JOIN dbo.EquipmentName dd
ON a.FK_EquipmentName = dd.PK_EquipmentName

GROUP BY a.EnteredDate, bb.EmployeeId, bb.EmployeeName, dd.EquipmentId, dd.EquipmentName;

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT 
      a.EnteredDate,
      bb.EmployeeId,
      bb.EmployeeName,
      dd.EquipmentId,
      dd.EquipmentName,
      CASE WHEN SUM(CASE FK_Status WHEN 2 THEN 1 ELSE 0 END) > 0 
           THEN 'Repair' ELSE 'OK' END AS StatusName
    FROM dbo.PIT_Inspection a
      INNER JOIN dbo.EmployeeName bb
        ON a.FK_EmployeeName = bb.PK_EmployeeName
      INNER JOIN dbo.EquipmentName dd
        ON a.FK_EquipmentName = dd.PK_EquipmentName
    GROUP BY
      a.EnteredDate,
      bb.EmployeeId,
      bb.EmployeeName,
      dd.EquipmentId,
      dd.EquipmentName
    

    【讨论】:

      【解决方案3】:

      将具有 distinct 的查询作为子查询,然后加入以获取“附加信息”。大致如下:

      SELECT (your orig fields, but take from inspection where you took from a)
      FROM 
          (SELECT DISTINCT a.FK_EmployeeName, a.EnteredDate, FK_EquipmentName
          FROM dbo.PIT_Inspection a) inspection
      INNER JOIN dbo.EmployeeName bb
              ON inspection.FK_EmployeeName = bb.PK_EmployeeName
      
              INNER JOIN dbo.EquipmentName dd
              ON inspection.FK_EquipmentName = dd.PK_EquipmentName 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 2022-11-10
        相关资源
        最近更新 更多