Выполнение запроса на конкретную дату приводит к ошибке в отчете - подзапрос возвратил более 1 значения - PullRequest
0 голосов
/ 24 апреля 2020

После запуска хранимой процедуры / запроса на конкретную дату выдает ошибку:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения. Заявление было прекращено. Предупреждение: нулевое значение устраняется с помощью агрегата или другой операции SET.

В другие даты оно работает нормально. В чем может быть проблема? Ниже мой код

USE [EMFactory_CAA_Test]
GO
/****** Object:  StoredProcedure [dbo].[Report_Exchange_Detail]    */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Report_Exchange_Detail] (@CustomerID INT, 
                                                @StartDate DATE, 
                                                @EndDate DATE, 
                                                @OpenOnly INT,
                                                @CEAS NVARCHAR(MAX),
                                                @RequestType INT)

AS 
BEGIN
SET NOCOUNT ON;

DECLARE @Main TABLE (RID INT, 
                     DEPRIID INT, 
                     RETRIID INT,
                     CustomerID INT,
                     ParatureTicketNumber NVARCHAR(100),
                     CloseDate DATETIME,
                     HasReturn BIT,
                     SLAStartDate DATETIME)

DECLARE @DEP TABLE (RIID INT,
                    DEPNumber NVARCHAR(100),
                    DikiID int,
                    Item NVARCHAR(100),
                    DEPSN NVARCHAR(100),
                    DEPTrackingNumber NVARCHAR(100),
                    EmployeeID NVARCHAR(100),
                    FirstName NVARCHAR(100),
                    LastName NVARCHAR(100),
                    Email NVARCHAR(100),
                    DRID INT,
                    DEPTypeID INT)

DECLARE @RET TABLE (RIID INT,
                    RIStatusID INT, 
                    ReturnNumber NVARCHAR(100),
                    ReturnReason NVARCHAR(MAX),
                    ReturnNote NVARCHAR(MAX),
                    ReturnModel NVARCHAR(100),
                    ExpectedSN NVARCHAR(100),
                    ActualSN NVARCHAR(100),
                    ExpectedTrackingNumber NVARCHAR(100),
                    ActualReturnTrackingNumber NVARCHAR(100),
                    ReturnReceivedDate NVARCHAR(100),
                    INSDisposition INT,
                    INSNotes NVARCHAR(MAX),
                    INSResult NVARCHAR(MAX),
                    RMANumber NVARCHAR(100),
                    RMADate DATETIME,                   
                    RepairInspectionDisposition NVARCHAR(100), 
                    RepairInspectionResult NVARCHAR(MAX),       
                    RepairReceivedDate DATETIME)


  IF @CEAS != '-1' AND CHARINDEX('-1',@CEAS) > 0 SET @CEAS = '-1'

  --Get request and misc info for dates provided
  INSERT INTO @Main (RID,CustomerID,ParatureTicketNumber,CloseDate,DEPRIID, SLAStartDate)
    SELECT 
      RID = r.RequestID, 
      CustomerID = r.CustomerID, 
      ParatureTicketNumber = r.ParatureTicketNumber,
      CloseDate = ri.CloseDate,
      DEPRIID = ri.RequestItemID,
      SLAStartDate = ri.SLAStartDate
    FROM dbo.Request r 
    JOIN dbo.RequestItem ri on r.RequestID = ri.RequestID
    WHERE r.CustomerID = @CustomerID 
    AND r.RequestTypeID = 5 
    AND ri.RequestItemTypeID = 1
    AND ri.StatusID = 5 
    AND ri.CloseDate BETWEEN @StartDate AND @EndDate
    AND EXISTS (Select 1 From dbo.Deployment d Where d.RequestItemID = ri.RequestItemID and (d.DeploymentTypeID = @RequestType or (@RequestType = 0 and d.DeploymentTypeID in (2,3))))

  --Split requestitems into DEP and RET
  UPDATE @Main SET HasReturn = CASE WHEN EXISTS (Select 1 From dbo.RequestItem ri Where ri.RequestID = RID and ri.RequestItemTypeID = 2) THEN 1 ELSE 0 END
  UPDATE @Main SET RETRIID = (Select ri.RequestItemID From dbo.RequestItem ri Where ri.RequestID = RID and ri.RequestItemTypeID = 2) WHERE HasReturn = 1

  --Gather DEP info
  INSERT INTO @DEP
    SELECT
      RIID = ri.RequestItemID, 
      DEPNumber = MAX(ri.EMTrackingNumber),
      DikiID = CASE WHEN MAX(di.KitID) IS NOT NULL THEN (Select TOP 1 diki2.DeploymentItemKitItemId From dbo.DeploymentItemKitItem diki2 Where diki2.RequestItemID = ri.RequestItemID and diki2.KitID = MAX(di.KitID) and diki2.ItemID = (Select ki.ItemID From dbo.KitItem ki Where ki.KitId = MAX(di.KitID) and ki.IsPrimaryKitItem = 1))
                    ELSE (Select TOP 1 diki3.DeploymentItemKitItemId From dbo.DeploymentItemKitItem diki3 Where diki3.RequestItemID = ri.RequestItemID and diki3.ItemID = MAX(di.ItemID))
                    END,
      Item = '',
      DEPSN = '',
      DEPTrackingNumber = ISNULL(MAX(s.ActualTrackingNumber),''),
      EmployeeID = MAX(dr.CustomerIdentifier),
      FirstName = MAX(dr.FName),
      LastName = MAX(dr.LName),
      Email = ISNULL(MAX(dr.email),''),
      MAX(dr.DeviceRecipientID),
      DEPTypeID = MAX(d.DeploymentTypeID)
    FROM dbo.RequestItem ri 
    JOIN dbo.Deployment d on ri.RequestItemID = d.RequestItemID
    JOIN dbo.DeploymentItem di ON di.DeploymentID = d.DeploymentID
    JOIN dbo.DeploymentItemKitItem diki ON diki.DeploymentItemID = di.DeploymentItemID
    JOIN dbo.Shipment s on ri.ShipmentID = s.ShipmentID
    JOIN dbo.DeviceRecipient dr on dr.DeviceRecipientID = d.DeviceRecipientID
    WHERE diki.Serialized = 1
    AND ri.RequestItemID IN (Select DEPRIID From @Main)
    GROUP BY ri.RequestItemID

  UPDATE @DEP SET Item = (Select i.Name From dbo.Item i Where i.ItemID = (Select diki.ItemID From dbo.DeploymentItemKitItem diki Where diki.DeploymentItemKitItemId = DikiID))
  UPDATE @DEP SET DEPSN = (Select ISNULL(diki.SerialNumber,'') From dbo.DeploymentItemKitItem diki Where diki.DeploymentItemKitItemId = DikiID)

  --Gather RET info
  INSERT INTO @RET
    SELECT 
      RIID = ri.RequestItemID,
      RTIStatusID = MAX(rti.ReturnItemStatusID),
      ReturnNumber = ISNULL(MAX(ri.EMTrackingNumber),''),
      ReturnReason = dbo.fnGetReturnReasonString (MAX(rt.ReturnID)),
      ReturnNote = ISNULL(MAX(rt.IssueDescription),''),
      ReturnModel = MAX(i.Name),
      ExpectedSN = MAX(rti.ExpectedSerialNumber),
      ActualSN = MAX(rti.ActualSerialNumber),
      ExpectedTrackingNumber = MAX(rt.InboundTrackingNumber),
      ActualReturnTrackingNumber = ISNULL(MAX(rti.ActualTrackingNumber),''),
      ReturnReceivedDate = CASE WHEN MAX(rti.ReturnItemStatusID) = 1 THEN 'Not Received'
                                WHEN MAX(rti.ReturnItemStatusID) = 9 THEN 'Canceled' + ISNULL(': '+MAX(rti.Notes),'')
                                ELSE CAST(CAST(MAX(rti.DateReceived) as date) as nvarchar(10))
                                END,
      INSDisposition = CASE WHEN MAX(rti.ReturnItemStatusID) IN (1,9) THEN -1 ELSE ISNULL(MAX(ins.InspectionResultID),0) END, 
      INSNotes = ISNULL(MAX(ins.InspectionNotes),''),
      INSResult = dbo.fnGetInspectionNotesString(MAX(ins.InspectionID)),
      RMANumber = ISNULL(MAX(rma.RMANumber),''),
      RMADate = MAX(rma.DateCreated),                   
      RepairInspectionDisposition = (Select ISNULL(MAX(ins.InspectionResultID),0) From dbo.Inspection ins Where ins.RequestItemID = MAX(r.RequestItemID)), 
      RepairInspectionResult = (Select dbo.fnGetInspectionNotesString(MAX(ins.InspectionID)) From dbo.Inspection ins Where ins.RequestItemID = MAX(r.RequestItemID)),        
      RepairReceivedDate = MAX(r.DateReceivedBack)
    FROM dbo.RequestItem ri 
    JOIN dbo.[Return] rt ON ri.RequestItemID = rt.RequestItemID
    JOIN dbo.ReturnItem rti ON rti.ReturnID = rt.ReturnID
    JOIN dbo.Item i ON i.ItemID = rti.ItemID
    LEFT JOIN dbo.Inspection ins ON ins.SpecificID = rti.ReturnItemID and ins.InspectionTypeID = 2
    LEFT JOIN dbo.Repair r ON r.GeneratingRequestItemID = ri.RequestItemID AND r.SerialNumber = rti.ActualSerialNumber
    LEFT JOIN dbo.RMA rma ON rma.RMA_ID = r.RMAId
    WHERE i.Serialized = 1
    AND rti.ReturnItemStatusID IN (1,7,9)
    AND ri.RequestItemID in (Select RETRIID From @Main Where RETRIID is not null and RETRIID > 0)
    GROUP BY ri.RequestItemID

    ;
    WITH CEA AS
    (SELECT
      DRRIDCEA = av.entityinstanceid,
      DRCEA = cea.attributedisplaylabel,
      DRCEAVALUE = av.value
    FROM dbo.AttributeValue av
    JOIN CustomerEntityAttribute cea on av.CustomerEntityAttributeID = cea.CustomerEntityAttributeID
    WHERE av.EntityInstanceID in (SELECT DRID FROM @DEP)
    AND cea.EntityTypeID = 1
    AND cea.ExcludeFromReports = 0
    AND av.Value IS NOT NULL
    AND av.Value !=''
    AND (cea.CustomerEntityAttributeID in (SELECT ID FROM dbo.fnSplitMultivalueIDList (@CEAS,',')) OR @CEAS = '-1') 
    )

  SELECT
    Customer = (Select c.Name From dbo.Customer c Where c.CustomerID = m.CustomerID),
    m.ParatureTicketNumber,
    dep.EmployeeID, 
    dep.FirstName, 
    dep.LastName, 
    dep.Email,
    CAAEscalation = CAST(m.SLAStartDate AS SMALLDATETIME),
    ShipDate = m.CloseDate,
    Age = DATEDIFF(DAY, m.CloseDate, GETDATE()),
    dep.DEPNumber, 
    dep.Item, 
    dep.DEPSN, 
    dep.DEPTrackingNumber,
    DEPType = (Select ldt.Name from dbo.LookupDeploymentType ldt Where ldt.DeploymentTypeID = dep.DEPTypeID),
    ReturnReason = CASE WHEN m.HasReturn = 1 THEN ret.ReturnReason ELSE 'Exchange w/o Return' END,
    ReturnNote = ISNULL(ret.ReturnNote,''), 
    ReturnModel = ISNULL(ret.ReturnModel,''), 
    ExpectedSN = ISNULL(ret.ExpectedSN,''), 
    ActualSN = ISNULL(ret.ActualSN,''), 
    ExpectedTrackingNumber = ISNULL(ret.ExpectedTrackingNumber,''), 
    ActualReturnTrackingNumber = CASE WHEN LEN(ret.ActualReturnTrackingNumber) = 34 THEN Right(ret.ActualReturnTrackingNumber,12) ELSE ISNULL(ret.ActualReturnTrackingNumber,'') END, 
    ReturnReceived = CASE WHEN ret.RIStatusID = 7 THEN 'Y' WHEN ret.RIStatusID = 9 THEN 'Cancelled' ELSE 'N' END, 
    ReturnReceivedDate = ISNULL(ret.ReturnReceivedDate,''),
    INSResult = ISNULL(ret.INSResult,''),
    INSNotes = ISNULL(ret.INSNotes,''),
    INSDisposition = CASE WHEN ret.INSDisposition = -1 OR ret.INSDisposition IS NULL THEN ''
                          WHEN ret.INSDisposition = 2 THEN 'Sent To Repair'
                          ELSE (Select lir.InspectionResultName From dbo.LookupInspectionResult lir Where lir.InspectionResultID = ret.INSDisposition)
                     END,
    RMANumber = ISNULL(ret.RMANumber,''),
    ret.RMADate,                   
    RepairInspectionDisposition = CASE WHEN ret.RepairInspectionDisposition = 2 THEN 'Sent To Repair'
                                       ELSE (Select lir.InspectionResultName From dbo.LookupInspectionResult lir Where lir.InspectionResultID = ret.RepairInspectionDisposition)
                                  END, 
    ret.RepairInspectionResult,        
    ret.RepairReceivedDate,
    cea.DRRIDCEA,
    cea.DRCEA,
    cea.DRCEAVALUE
  FROM @Main m
  JOIN @DEP dep ON dep.RIID = m.DEPRIID
  LEFT JOIN @RET ret ON ret.RIID = m.RETRIID 
  LEFT JOIN cea on dep.DRID = cea.drridcea
  WHERE (@OpenOnly = 0 OR (@OpenOnly = 1 AND ret.ActualSN = '' AND m.HasReturn = 1)) 
  ORDER BY Age, m.DEPRIID, cea.DRCea

END
...