2016-10-27 1 views
1

SQL Server에서 작업 중이므로 쿼리에 대한 도움이 필요합니다. 나는 2 표 RosterCustomerCONVERT를 사용하여 다른 테이블의 CASE 및 SELECT 사용

:

는 시나리오입니다.

PK [ID] 두 테이블에 모두 존재합니다.

CREATE TABLE [dbo].[Tbl_Roster_Test](
    [CONCATENATE_NUMBER] [varchar](100) NOT NULL, 
    [CONCATENATE_NAME] [varchar](100) NULL, 
    [CUST_ID] [varchar](100) NULL, 
    [CUST_NAME] [varchar](100) NULL, 
    [ID] [varchar](100) NOT NULL, 
    [ID_NAME] [varchar](100) NULL, 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Tbl_Customer_Test](
    [ID] [varchar](100) NOT NULL, 
    [CUST_ID_1] [varchar](100) NULL, 
    [CUST_ID_2] [varchar](100) NULL, 
) ON [PRIMARY] 

INSERT INTO [BOSSTest].[dbo].[Tbl_Roster_Test] 
([CONCATENATE_NUMBER],[CONCATENATE_NAME],[CUST_ID],[CUST_NAME],[ID],[ID_NAME]) 
SELECT 'US193085','UNIVERSITY OF ARIZONA','','','US193085','UNIVERSITY OF ARIZONA' 
UNION ALL 
SELECT 'US193085117933','UNIVERSITY OF ARIZ','117933','UNIVERSITY OF ARIZ','US193085','UNIVERSITY OF ARIZONA' 
UNION ALL 
SELECT 'US193085T22346','UNIVERSITY OF AZ','T22346','UNIVERSITY OF AZ','US193085','UNIVERSITY OF ARIZONA' 

INSERT into [BOSSTest].[dbo].[Tbl_Customer_Test] 
([ID],[CUST_ID_1],[CUST_ID_2]) 
SELECT 'US193085','117933','' 
UNION ALL 
SELECT 'US193085','T22346','' 
UNION ALL 
SELECT 'US193085','T22346','117933' 
UNION ALL 
SELECT 'US193085','','' 

논리 ...이 알고

In [Tbl_Roster_Test] 
IF [CUST_ID] = '' THEN [CONCATENATE_NAME] = [ID_Name] 
ELSE 
IF [CUST_ID] <> '' THEN [CONCATENATE_NAME] = [Cust_ID_Name] 

은, 지금은 [ID] 위의 논리를 사용하여를 사용하여 두 테이블을 연결하기 위해 노력하고있어. 다음 [ID_NAME]을 선택하지 않으면이 [CUST_ID] 다음, [Cust_ID_Name] 선택이 있다면

3 경우가 있습니다

1. There is no data in [Cust_ID] 
2. There is data in [CUST_ID_1] 
3. There is no data in [CUST_ID_1] and There is data in [CUST_ID_2] 

나는이 쿼리를 실행

...

SELECT 
C.[ID] 
,C.[CUST_ID_1] 
,C.[CUST_ID_2] 
,(SELECT TOP 1 ISNULL([CONCATENATE_NAME],'') FROM BOSSTest.dbo.Tbl_Roster_Test R WHERE C.[ID] = R.[ID]) AS [Customer_Name] 

FROM [BOSSTest].[dbo].[Tbl_Customer_Test] C 

이것은 내가 얻은 것입니다.

+--------+------ -+---------+---------------------+ 
|  ID|CUST_ID_1|CUST_ID_2|  Customer_Name| 
+--------+------ -+---------+---------------------+ 
|US193085| 117933|   |UNIVERSITY OF ARIZONA| 
|US193085| T22346|   |UNIVERSITY OF ARIZONA| 
|US193085| T22346| 117933|UNIVERSITY OF ARIZONA| 
|US193085|   |   |UNIVERSITY OF ARIZONA| 
+--------+---------+---------+---------------------+ 

는 그럼 난 ... 하위 쿼리를 사용하는

SELECT 
[ID] 
,[CUST_ID_1] 
,[CUST_ID_2] 
,CASE WHEN [CUST_ID_1] <> 
THEN (SELECT TOP 1 CONVERT(INT, CASE WHEN IsNumeric(CONVERT(VARCHAR(100),[CONCATENATE_NAME])) = 1 then CONVERT(VARCHAR(100),[CONCATENATE_NAME]) else 0 End) FROM BOSSTest.dbo.Tbl_Roster_Test R WHERE [CUST_ID_1] = R.[CUST_ID]) 
ELSE 0 END AS [Customer_Name] 

FROM (

    SELECT 
    C.[ID] 
    ,C.[CUST_ID_1] 
    ,C.[CUST_ID_2] 
    ,(SELECT TOP 1 ISNULL([CONCATENATE_NAME],'') FROM BOSSTest.dbo.Tbl_Roster_Test R WHERE C.[ID] = R.[ID]) AS [Customer_Name] 

    FROM [BOSSTest].[dbo].[Tbl_Customer_Test] C 

) AS TEST 

을 시도 그리고 이것은 내가 무엇을 얻을 수 있습니다.

+--------+------ -+---------+-------------+ 
|  ID|CUST_ID_1|CUST_ID_2|Customer_Name| 
+--------+------ -+---------+-------------+ 
|US193085| 117933|   |   NULL| 
|US193085| T22346|   |   0| 
|US193085| T22346| 117933|   0| 
|US193085|   |   |   0| 
+--------+---------+---------+-------------+ 

나는 다음과 같은 오류 Syntax error converting the varchar value 'UNIVERSITY OF AZ' to a column of data type int.

을 피하기 위해 CONVERT을 사용하지만 끝이 정말 필요합니다.

+--------+------ -+---------+---------------------+ 
|  ID|CUST_ID_1|CUST_ID_2|  Customer_Name| 
+--------+------ -+---------+---------------------+ 
|US193085| 117933|   | UNIVERSITY OF ARIZ| 
|US193085| T22346|   |  UNIVERSITY OF AZ| 
|US193085| T22346| 117933|  UNIVERSITY OF AZ| 
|US193085|   |   |UNIVERSITY OF ARIZONA| 
+--------+---------+---------+---------------------+ 

내가 3 케이스를 사용하여이 논리를 실행하고 CONVERT을 잘 활용할 수있는 방법에 대한 제안. 사전에

감사합니다, 루이스

답변

1

나는 그 Tbl_Customer_Test 삽입 절에 오류가 있다고 생각 - 당신은 대신 117933의 H17933이 마음습니까? 그 다음 사건을 만약

당신이

SELECT CT.*,RT.CONCATENATE_NAME 
FROM [dbo].[Tbl_Customer_Test] CT 
left join [dbo].[Tbl_Roster_Test] RT 
on RT.CONCATENATE_NUMBER = 
CT.[ID] + isnull(nullif(ct.[CUST_ID_1],''), ct.[CUST_ID_2]) 

대답처럼 떨어지게를 작성해야하는 것은

ID   CUST_ID_1 CUST_ID_2 CONCATENATE_NAME 
---------- ----------- ----------- --------------------- 
US193085 H17933     UNIVERSITY OF ARIZ 
US193085 T22346     UNIVERSITY OF AZ 
US193085 T22346  H17933  UNIVERSITY OF AZ 
US193085       UNIVERSITY OF ARIZONA 

UPD

인해 추가 댓글에 (우리가 먹는 첫 번째 심볼 :

입니다
SELECT CT.*,RT.CONCATENATE_NAME 
FROM [dbo].[Tbl_Customer_Test] CT 
join [dbo].[Tbl_Roster_Test] RT 
on RT.CONCATENATE_NUMBER like 
CT.[ID] + isnull(stuff(isnull(nullif(ct.[CUST_ID_1],''),ct[CUST_ID_2]),1,1,'_'),'') 
+0

제공되는 데이터는 다음과 같습니다. 케이. [CUST_ID] 열은 문자 또는 숫자로 시작될 수 있습니다. 테이블에서 필자는 필드를 varchar로 정의했습니다. –

+1

Roster_test 117933? Customer_test H17933? 괜찮아? – DimaSUN

+0

솔루션은 H17933과 함께 작동하지만, 제 경우에는 117933이있을 때 여전히 NULL이됩니다. –