У меня есть следующий SQL, включая оператор CASE
для D.TIN_TYPE
.Я хочу изменить оператор CASE
(или использовать альтернативу) для добавления во второе условие WHEN, чтобы в WHEN D.TIN_TYPE = 'S' AND
была запятая (,) в строке D.PAYEE_NAME1
, а затем разбить имя на два столбца, используя LEFT /Функция CHARINDEX, RIGHT / CHARINDEX, в противном случае просто отобразите строку как есть (если в строке нет запятой).Столбец не всегда отформатирован как Фамилия, Имя (некоторые из них Имя Фамилия ), поэтому мне нужно проверить наличие запятой в строке.Как мне это сделать?
SELECT D.PAYER_TIN, '001', YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN,
CASE WHEN D.TIN_TYPE = 'F' THEN '001'
WHEN D.TIN_TYPE = 'S' THEN '002'
END AS 'Taxpayer Identification Type',
A.VENDOR_ID,
CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
WHEN D.TIN_TYPE = 'S' AND --Additional logic for existence of comma--
ELSE D.PAYEE_NAME1
END AS 'PAYEE_NAME1',
D.PAYEE_NAME1,
D.PAYEE_NAME2,
D.PAYEE_ADDRESS1,
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7),
'US',
D.WTHD_BOX1,
D.WTHD_BOX2,
D.WTHD_BOX3,
FROM PS_WTHD_TRXN_TBL A, PS_TMP_1099_COPYB D, PS_GHS_1099_PA_VW2 E
WHERE ( A.WTHD_TYPE = D.WTHD_TYPE
AND A.VENDOR_ID = D.VENDOR_ID
AND YEAR( A.PYMNT_DT) = '2018')
GROUP BY D.PAYER_TIN, YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN, CASE WHEN D.TIN_TYPE = 'F' THEN '001'
WHEN D.TIN_TYPE = 'S' THEN '002'
END, A.VENDOR_ID, D.PAYEE_NAME1, D.PAYEE_NAME2, D.PAYEE_ADDRESS1,
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7),
D.WTHD_BOX1, D.WTHD_BOX2, D.WTHD_BOX3, D.WTHD_BOX6, D.WTHD_BOX7, D.WTHD_BOX14, D.WTHD_BOX16, D.WTHD_BOX18
, CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
ELSE D.PAYEE_NAME1
END
РЕДАКТИРОВАТЬ:
Вот отредактированный SQL, используя дополнительный WHEN в операторе CASE.Он работает, но для столбца с фамилией (функция RIGHT) возвращает имя и фамилию.Как я могу просто вернуть фамилию (символы перед запятой)?Также я пытался использовать END AS «Имя» и END AS «Фамилия» для каждого WHEN, но получил синтаксическую ошибку.Можно ли дать столбцам разные имена?
SELECT D.PAYER_TIN, '001', 13679089, YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN,
CASE WHEN D.TIN_TYPE = 'F' THEN '001'
WHEN D.TIN_TYPE = 'S' THEN '002'
END AS 'Taxpayer Identification Type',
A.VENDOR_ID,
CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN LEFT(D.PAYEE_NAME1,CHARINDEX(',', D.PAYEE_NAME1)-1) --END AS 'First Name'
WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN RIGHT(D.PAYEE_NAME1, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', D.PAYEE_NAME1)+1 ) --END AS 'Last Name'
ELSE D.PAYEE_NAME1
END AS 'PAYEE_NAME1',
D.PAYEE_NAME1,
D.PAYEE_NAME2,
D.PAYEE_ADDRESS1,
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7),
'US',
D.WTHD_BOX1,
D.WTHD_BOX2,
D.WTHD_BOX3,
D.WTHD_BOX6,
D.WTHD_BOX7,
D.WTHD_BOX14,
D.WTHD_BOX16,
D.WTHD_BOX18
FROM PS_WTHD_TRXN_TBL A, PS_TMP_1099_COPYB D, PS_GHS_1099_PA_VW2 E
WHERE ( A.WTHD_TYPE = D.WTHD_TYPE
AND A.VENDOR_ID = D.VENDOR_ID
AND YEAR( A.PYMNT_DT) = '2018'
AND A.WTHD_CLASS IN ('01','02','07')
AND A.VENDOR_ID = E.VENDOR_ID
AND A.VNDR_LOC = E.VNDR_LOC
AND E.YEAR = '2018'
AND D.WTHD_CNTL_ID = 'TGC'
AND D.WTHD_BOX18 > 0.00
AND A.VENDOR_ID <> '80577A' )
GROUP BY D.PAYER_TIN, YEAR( (CONVERT(CHAR(10),A.PYMNT_DT,121))), D.PAYEE_TIN, CASE WHEN D.TIN_TYPE = 'F' THEN '001'
WHEN D.TIN_TYPE = 'S' THEN '002'
END, A.VENDOR_ID, D.PAYEE_NAME1, D.PAYEE_NAME2, D.PAYEE_ADDRESS1,
LEFT(PAYEE_CITYSTZIP,CHARINDEX(',', PAYEE_CITYSTZIP)-1),
SUBSTRING(PAYEE_CITYSTZIP, CHARINDEX(',', PAYEE_CITYSTZIP)+2, 2),
RIGHT(PAYEE_CITYSTZIP, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', PAYEE_CITYSTZIP)-7),
D.WTHD_BOX1, D.WTHD_BOX2, D.WTHD_BOX3, D.WTHD_BOX6, D.WTHD_BOX7, D.WTHD_BOX14, D.WTHD_BOX16, D.WTHD_BOX18
, CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
ELSE D.PAYEE_NAME1
END,
CASE WHEN D.TIN_TYPE = 'F' THEN LEFT(D.PAYEE_NAME1, 30)
WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN LEFT(D.PAYEE_NAME1,CHARINDEX(',', D.PAYEE_NAME1)-1) --END AS 'First Name'
WHEN D.TIN_TYPE = 'S' AND CHARINDEX(',',D.PAYEE_NAME1) > 0 THEN RIGHT(D.PAYEE_NAME1, LEN(PAYEE_CITYSTZIP) - CHARINDEX(',', D.PAYEE_NAME1)+1 ) --END AS 'Last Name'
ELSE D.PAYEE_NAME1
END