使用不同字段SQL Server的联合顺序

使用不同字段SQL Server的联合顺序,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试使用排序依据对下面的查询进行排序。但是,当我使用MonthYear字段时,输出结果显示如下,而不是按最近的年份和月份进行相应排序 按月份排序,每小时输出一次 MonthYear 2017/9 2017/8 2017/7 2017/6 2017/5 2017/4 2017/10 因此,我想尝试按顺序按年份和月份,但我不能这样做,因为union all行后的另一个查询具有不同的字段,即a.created_year。我有什么办法可以

我正在尝试使用排序依据对下面的查询进行排序。但是,当我使用MonthYear字段时,输出结果显示如下,而不是按最近的年份和月份进行相应排序

按月份排序,每小时输出一次

 MonthYear
    2017/9
    2017/8
    2017/7
    2017/6
    2017/5
    2017/4
    2017/10
因此,我想尝试按顺序按年份和月份,但我不能这样做,因为union all行后的另一个查询具有不同的字段,即a.created_year。我有什么办法可以做吗

SELECT      CONVERT(varchar, A.YEAR) + '/' +  CONVERT(varchar, A.MONTH)AS MonthYear
FROM            PAY_Previous AS A LEFT OUTER JOIN
                         EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO LEFT OUTER JOIN
                         V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
WHERE   A.EMPLOYEE_NO = '710049' AND      A.FREQUENCY = 2 and (day(getdate())>=28 or month(getdate()) > a.Month or YEAR(getdate()) > A.YEAR )



UNION ALL-

SELECT       CONVERT(varchar, YEAR(A.CREATED_DATE)) + '/' + CONVERT(varchar, A.MONTH) AS MonthYear
FROM            PAY_Current AS A LEFT OUTER JOIN
                         EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO LEFT OUTER JOIN
                         V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
WHERE   A.EMPLOYEE_NO = '710049'AND  A.FREQUENCY = 2  and (day(getdate())>=28 or month(getdate()) > a.Month or YEAR(getdate()) > A.CREATED_DATE )

ORDER BY YEAR(A.CREATED_DATE) DESC ,A.MONTH DESC
预期产量

 MonthYear
    2017/10
    2017/9
    2017/8
    2017/7
    2017/6
    2017/5
    2017/4

将数据保留为数字,直到最后一刻,然后仅转换最小的列表进行表示,这样就可以将数字列用于对结果进行排序

SELECT CONVERT(varchar, d.[YEAR]) + '/' + CONVERT(varchar, d.[MONTH]) AS MonthYear
FROM 
    SELECT
            A.[YEAR] , A.[MONTH]
    FROM PAY_Previous AS A
    LEFT OUTER JOIN EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO
    LEFT OUTER JOIN V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
    WHERE A.EMPLOYEE_NO = '710049'
    AND A.FREQUENCY = 2
    AND (DAY(GETDATE()) >= 28
    OR MONTH(GETDATE()) > a.Month
    OR YEAR(GETDATE()) > A.YEAR)

    UNION

    SELECT
            YEAR(A.CREATED_DATE) [Year] , A.[MONTH]
    FROM PAY_Current AS A
    LEFT OUTER JOIN EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO
    LEFT OUTER JOIN V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
    WHERE A.EMPLOYEE_NO = '710049'
    AND A.FREQUENCY = 2
    AND (DAY(GETDATE()) >= 28
    OR MONTH(GETDATE()) > a.Month
    OR YEAR(GETDATE()) > A.CREATED_DATE)
) d
ORDER BY d.[YEAR] DESC, d.[MONTH] DESC
顺便说一句:年和月都是T-SQL使用的术语,使用它们作为列名称不是一个好主意

如果你需要一个可以可靠地重新排序的形式的结果,那么也许你可以考虑使用月数的前导零。e、 g

CONVERT(varchar(4), d.[YEAR]) + '/' + RIGHT('0' + CONVERT(varchar(2), d.[MONTH]),2) AS MonthYear
它看起来像这样,并且排序正确

2017/10
2017/04
2017/03
2017/02
2017/01
2016/10
2016/05

您可能会遇到排序问题,因为您使用的是Created_Date进行排序,但在语句之间使用的MonthYear字段不同

试试这个:

select MonthYear from (
    SELECT      CONVERT(varchar, A.YEAR) + '/' +  CONVERT(varchar, A.MONTH)AS MonthYear, A.YEAR yr, A.MONTH mon
    FROM            PAY_Previous AS A LEFT OUTER JOIN
                             EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO LEFT OUTER JOIN
                             V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
    WHERE   A.EMPLOYEE_NO = '710049' AND      A.FREQUENCY = 2 and (day(getdate())>=28 or month(getdate()) > a.Month or YEAR(getdate()) > A.YEAR )

    UNION ALL

    SELECT       CONVERT(varchar, YEAR(A.CREATED_DATE)) + '/' + CONVERT(varchar, A.MONTH) AS MonthYear. YEAR(A.CREATED_DATE)) yr, CONVERT(varchar, A.MONTH) mon
    FROM            PAY_Current AS A LEFT OUTER JOIN
                             EMPLOYEE_BADGE AS B ON A.EMPLOYEE_NO = B.EMPLOYEE_NO LEFT OUTER JOIN
                             V_EMPLOYEE_PROFILES AS C ON A.EMPLOYEE_NO = C.EMPLOYEE_NO
    WHERE   A.EMPLOYEE_NO = '710049'AND  A.FREQUENCY = 2  and (day(getdate())>=28 or month(getdate()) > a.Month or YEAR(getdate()) > A.CREATED_DATE )
    )x

ORDER BY yr DESC, mon DESC

对于pay_当前表,使用[year],它应该是a。创建了你的日期。好的,我修正了,谢谢。我相信即使没有更正,您也会遵循一般建议。太好了,请点击勾号接受。这对其他人意味着,tere是一种解决方案,既能帮助那些寻找答案的人,也能帮助那些寻找仍有待解决的问题的人。