【发布时间】:2015-01-23 04:29:18
【问题描述】:
我读到这应该是可能的,但我无法让它发挥作用!我试过两种方式设置字段名称 - 没有骰子。
USE RTIDatastore;
DECLARE @PAYE AS VARCHAR(20) = 'T6901' -- 'F1867' -- 'S860'
DECLARE @Product AS VARCHAR(20) = 'ADPFREEDOMAS2';
DECLARE @TaxYear AS CHAR(2) = '15'; -- NB No EMP data for FPS14s
DECLARE @EndPeriod AS INTEGER = 6;
DECLARE @OrderBy AS CHAR(1) = 'S';
DECLARE @OrderTest AS VARCHAR(10) = 'NINO'; -- 'Name';
-- this gets all the EMP records, and the first associated NI records (if any)
SELECT
R.[EmployerPAYE] AS PAYE
, H.[ICR] AS ICR
, E.[NINO] AS NINo
, E.[Surname] + ', ' + E.[Forename] AS Name
, E.[Surname] AS SurName -- added for testing
, E.[Forename] AS ForeName -- added for testing
, EMP.[EmploymentID] AS EmploymentID
, EMP.[ATT3_19_PayrollID] AS ATT3_19_PayrollID -- identifies EMP record
, EMP.[ALC14_TaxCode] AS ALC1_4_TaxCode
, NI.[Employee_NI] AS NI_PK
, NI.[Emp2_NILetter] AS EMP2_NILetter
FROM [RTIDatastore].[dbo].[Header] H
JOIN [RTIDatastore].[dbo].[Employer] R ON H.[HeaderID] = R.[HeaderID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employee] E ON R.[EmployerID] = E.[EmployerID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employment] EMP ON E.[EmployeeID] = EMP.[EmployeeID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employee_NI] NI ON EMP.[EmploymentID] = NI.[EmploymentID_FK]
WHERE H.[SenderID] = @Product
AND H.[MessageType] = 'FPS' + @TaxYear
AND R.[EmployerPAYE] = @PAYE
AND (NI.[Employee_NI] LIKE '%_NI_1' OR NI.[Employee_NI] IS NULL)
UNION
-- this gets any additional NI records
SELECT
R.[EmployerPAYE] AS PAYE
, H.[ICR] AS ICR
, E.[NINO] AS NINo
, E.[Surname] + ', ' + E.[Forename] AS Name
, E.[Surname] AS SurName
, E.[Forename] AS ForeName
, EMP.[EmploymentID] AS EmploymentID
, EMP.[ATT3_19_PayrollID] AS ATT3_19_PayrollID -- identifies EMP record
, EMP.[ALC14_TaxCode] AS ALC1_4_TaxCode
, NI.[Employee_NI] AS NI_PK
, NI.[Emp2_NILetter] AS EMP2_NILetter
FROM [RTIDatastore].[dbo].[Header] H
JOIN [RTIDatastore].[dbo].[Employer] R ON H.[HeaderID] = R.[HeaderID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employee] E ON R.[EmployerID] = E.[EmployerID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employment] EMP ON E.[EmployeeID] = EMP.[EmployeeID_FK]
LEFT JOIN [RTIDatastore].[dbo].[Employee_NI] NI ON EMP.[EmploymentID] = NI.[EmploymentID_FK]
WHERE H.[SenderID] = @Product
AND H.[MessageType] = 'FPS' + @TaxYear
AND R.[EmployerPAYE] = @PAYE
AND NI.[Employee_NI] NOT LIKE '%_NI_1'
-- generally Surname is safer than NINo or PayrollID, but not always!
--ORDER BY CASE WHEN @OrderBy = 'N' THEN NINo
-- WHEN @OrderBy = 'P' THEN ATT3_19_PayrollID
-- ELSE Surname
-- END
-- , ICR
-- , EmploymentID
-- , NI_PK
ORDER BY @OrderTest -- Name
--, NINo
--, ATT3_19_PayrollID
, ICR
, EmploymentID
, NI_PK
上述两个 ORDER 子句都失败了,但这工作正常:
ORDER BY Name
--, NINo
--, ATT3_19_PayrollID
, ICR
, EmploymentID
, NI_PK
我需要将代码放入存储过程中,所以我真的不想写3次,因为可能不同的顺序要求...
【问题讨论】:
标签: sql-server select sql-order-by union