2016-08-08 5 views
-1

2 개의 다른 공급 업체 응용 프로그램에서 잠재적으로 일치하는 데이터를 표시해야합니다. 사용자가 비교할 수 있도록 데이터를 스택해야합니다. 그러면 일치 항목을 수락하거나 거부 할 수 있습니다. 이렇게하려면 성 (姓), 대문자, 시스템 순으로 대문자로 주문하고 싶습니다. 따라서 SH 시스템의 레코드는 PR 시스템 레코드 바로 앞에 나타납니다. select가 훌륭하게 작동합니다. 제 문제는 order by 절입니다. 내가유니온을 할 때 ORDER BY 작업을 수행 할 수 없습니다.

ORDER BY LName, FName, BkNum,RecordType DESC 

의 'BY ORDER'은을 사용하는 경우 I 행 3과 4가 잘못된 순서로되어

RecordType LName FName BkNum  PIN 
SH   SANCHEZ MICHAEL 1600010808 54727 
PR   SANCHEZ MICHAEL 1600010808 54727 
PR   Suarez Isaiah 1600010838 30019800 
SH   SUAREZ ISIAIAH 1600010838 30019800 
SH   SYKES ROBERT 1600010831 588572 
PR   SYKES ROBERT 1600010831 588572 

공지 얻을. 나는 아래의 (본 게시물에 대한 간체) 쿼리를 사용하고 싶지만 내가 할 때, 나는 메시지,

Msg 207, Level 16, State 1, Line 53 
Invalid column name 'LName'. 
Msg 104, Level 16, State 1, Line 53 
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator. 

내가 CASE 문에서 'UPPER'을 제거하는 시도를 얻을뿐만 아니라 추가 ' UPPER '를 위의 단순화 된 ORDER BY 문으로 수정하십시오. 난 항상 같은 오류 메시지가 나타납니다. 저는 MS SQL 2012에 있습니다. 내가 뭘 잘못하고 있니? 시간과 통찰력에 미리 감사드립니다!

DECLARE @FromDate DATETIME, @ToDate  DATETIME, @TempSortOrder char(2) 

-- For testing 
SET @FromDate = CAST('07-12-2016' as DATETIME) 
SET @ToDate = CAST('07-13-2016' as DATETIME) 
SET @TempSortOrder = '1A' 

SELECT 'SH'     AS RecordType, 
     ISNULL(LastName,'')  AS LName, 
     ISNULL(FirstName,'') AS FName, 
     SH.BkNum    AS BkNum, 
     SHCX.PIN    AS PIN 
FROM BkSher AS SH 
JOIN BkSherCase AS SHCX ON SH.BkNum = SHCX.BkNum 
WHERE SH.ArrDate BETWEEN @FromDate AND @ToDate AND SH.LastName like 'S%' 

UNION 

SELECT 'PR'      AS RecordType, 
     ISNULL(OffLastName,'') AS LName, 
     ISNULL(OffFirstName,'') AS FName, 
     SHCX.BkNum    AS BkNum, 
     CX.PIN     AS PIN 
FROM BkCase AS CX 
JOIN BkSherCase AS SHCX ON CX.PIN = SHCX.PIN 
JOIN BkSher AS SH ON SH.BkNum = SHCX.BkNum 
WHERE SH.ArrDate BETWEEN @FromDate AND @ToDate AND SH.LastName like 'S%' 

ORDER BY 
    CASE WHEN @TempSortOrder = '1A' THEN UPPER(LName) END ASC, 
    CASE WHEN @TempSortOrder = '1A' THEN UPPER(FName) END ASC, 
    CASE WHEN @TempSortOrder = '1A' THEN RecordType END DESC, 

    CASE WHEN @TempSortOrder = '1D' THEN LName END DESC, 
    CASE WHEN @TempSortOrder = '1D' THEN FName END DESC, 
    CASE WHEN @TempSortOrder = '1D' THEN RecordType END DESC 
+3

왜 행 3과 4의 순서가 잘못 되었습니까? 그들은 나에게 잘 보인다. 당신은 '이사야'대'이셔야 '를 알았습니까? 제 2의 추가 I를 보라? – sstan

+0

잠깐, 무슨 오류 메시지가 나옵니까? 실제로 * 오류 메시지를 * 나열하지 않기 때문에 ... –

+0

대소 문자를 구분하지 않는 정렬에서 UPPER 또는 LOWER에 의한 정렬은 모든 문자열이 동일하므로 도움이되지 않습니다. 이를 수행하기 위해 정렬 술어에 컬럼 레벨 조합이 필요합니다. –

답변

0

신속하고 더러운 솔루션은 내부 선택에 노동 조합을 포장하는 것입니다. 그런 다음 별칭 LNameFName을에서 순서대로 사용할 수 있습니다. 당신이 SELECT

하지만에서 같은 열을 사용해야 할 것이다 UNION 없었다 경우 즉

SELECT * FROM 
(
    -- put the select with union here 
) Result 
ORDER BY 
    CASE WHEN @TempSortOrder = '1A' THEN UPPER(LName) END ASC, ... 

는하지만 모든 하찮은입니다. 대소 문자를 구분하는 데이터 정렬 UPPER()을 사용하지 않으면 문제가되지 않으므로 필요하지 않습니다. 어느 쪽이든 "이사야는" "Isiaiah"각 쿼리의 조합을 사용하는 경우

0

, 그것은 당신이 괄호 또는 중첩 된 쿼리로 묶어야해야하지 않는 한에 의해 순서를 받아 들일 것, 전에 살펴 봐야

에 한번 올 것이다 이것 :

select all.id,all.fname 
(select a.id,a.fname from 
(select id,fname from table1 order by fname) as a 

union 

select id,fname from table2) as all order by all.fname 
0

좋아 - 추한,하지만 작동 - 나는 해결책을 구겨. temp 테이블에서 최대 3000 행을 갖기 때문에 성능이 좋습니다. 나는 더 나은 아이디어에 열려 있습니다 - 나는 임시 테이블의 팬이 아니지만, 반면에, 나는 꽤 정확한 출력을 얻을 행복합니다.

-- Create temp table. 
DECLARE @ResultsList table 
     (RecordType  char(2), 
     LName   varchar(30), 
     FName   varchar(30), 
     ArrDate   datetime, 
     BkNum   varchar(10), 
     PIN    varchar(10), 
     SHRowNum  bigint   ) 

--Find all the SH records, and order them, putting the order into SHRowNum 
INSERT INTO @ResultsList(RecordType,LName,FName,ArrDate,BkNum,PIN,SHRowNum) 
SELECT 'SH', 
     ISNULL(LastName,''), 
     ISNULL(FirstName,''), 
     [DOB], 
     ArrDate, 
     SH.BookingNum, 
     SHCX.PIN, 
     ROW_NUMBER() OVER (ORDER BY 
      CASE WHEN @InputSortOrder = '1A' THEN LastName END ASC, 
      CASE WHEN @InputSortOrder = '1A' THEN FirstName END ASC, 

      CASE WHEN @InputSortOrder = '1D' THEN LastName END DESC, 
      CASE WHEN @InputSortOrder = '1D' THEN FirstName END DESC) 
FROM BkSher AS SH 
LEFT OUTER JOIN BkSherCase AS SHCX 
    ON SH.BookingNum = SHCX.BookingNum 
WHERE SH.ArrDate BETWEEN @InputRecdFromDate AND @InputRecdToDate 

-- Find the corresponding PR records, and copy the order from the temp table 
INSERT INTO @ResultsList(RecordType,LName,FName,ArrDate,BkNum,PIN,SHRowNum) 
SELECT 'PR', 
     ISNULL(OffenderLastName,''), 
     ISNULL(OffenderFirstName,''), 
     ArrDate, 
     BookingNum, 
     CX.PIN, 
     RES.SHRowNum 
FROM tblMWBookingsCaseload AS CX 
JOIN @ResultsList AS RES ON CX.PIN = RES.PIN 

-- If a SH record matches several PR records, the above query results in 
-- duplicate SH records, which we don't want. (We want to see 1 SH record 
-- followed by a list of possible matches.) This deletes the dups. 
DELETE R 
From @ResultsList R 
INNER JOIN @ResultsList R2 ON R2.BookingNum = R.BookingNum 
WHERE R.RecordType = 'SH' 
    AND R2.RecordType = 'SH' 
    AND R.BookingNum = R2.BookingNum 
    AND R.SHRowNum > R2.SHRowNum 

-- Return sorted results. Each SH record is followed by 
-- its corresponding PR records. 
SELECT RecordType, LName, FName, ArrDate, BookingNum, PIN 
FROM @ResultsList 
ORDER BY SHRowNum, RecordType DESC 
관련 문제