【问题标题】:Using ORDER BY with UNION and ALIASES with complex query将 ORDER BY 与 UNION 和 ALIASES 一起用于复杂查询
【发布时间】:2017-09-13 02:50:28
【问题描述】:

我想用 UNION 对以下查询的 Order No 进行排序,但尽管用谷歌搜索了很多,但还是无法完成。

IF LEN(@_Order_No)=0
BEGIN 
    SELECT a._PROCESS_INST_NO,c._ISSUE_DATE,c._DELIVERY_DATE, a._Order_No,a._GOODS_CD,a._GOODS_NAME ,
            --a._QTY,
            CAST(a._QTY  as DECIMAL (38,2))  as _QTY,
                b._GOODS_CD as RM_CD,b._GOODS_NAME as RM_NAME,b._UNIT,
            (CASE  
                WHEN  LEFT(a._GOODS_NAME,2)='SS' OR LEFT(a._GOODS_NAME,2)='SN'  THEN
                CAST(a._QTY as DECIMAL (38,2)) * CAST(b._QTY  as DECIMAL (38,2))/ NULLIF(SUM(CAST(a._QTY AS decimal(38,2) )) OVER (PARTITION BY  a._Order_No ,b._GOODS_CD),0) 
            ELSE
                CAST(b._QTY  as DECIMAL (38,2))
            END) as  RM_QTY
        FROM [ENVNDIVDB].[dbo].[TBL_PROC_PM] a
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PMS] b
        ON a._PROCESS_INST_NO=b._PROCESS_INST_NO 
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PH] c
        ON a._PROCESS_INST_NO=c._PROCESS_INST_NO
        WHERE c._DELIVERY_DATE BETWEEN @startDate AND @endDate

    UNION ALL

    SELECT a._PROCESS_INST_NO,c._ISSUE_DATE,c._DELIVERY_DATE, a._Order_No,a._GOODS_CD,a._GOODS_NAME ,
            --a._QTY,
            CAST(a._QTY  as DECIMAL (38,2))  as _QTY,
            b._GOODS_CD as RM_CD,b._GOODS_NAME as RM_NAME,b._UNIT,
            (CASE  
                WHEN  LEFT(a._GOODS_NAME,2)='SS' OR LEFT(a._GOODS_NAME,2)='SN'  THEN
                CAST(a._QTY as DECIMAL (38,2)) * CAST(b._QTY  as DECIMAL (38,2))/ NULLIF(SUM(CAST(a._QTY AS decimal(38,2) )) OVER (PARTITION BY  a._Order_No ,b._GOODS_CD),0) 
            ELSE CAST(b._QTY  as DECIMAL (38,2))
            END) as  RM_QTY
        FROM [ENVNDIVDB].[dbo].[TBL_PROC_PM] a
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PMS] b
        ON a._PROCESS_INST_NO=b._PROCESS_INST_NO 
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PH] c
        ON a._PROCESS_INST_NO=c._PROCESS_INST_NO
        WHERE c._DELIVERY_DATE BETWEEN @startDate AND @endDate

    SELECT '' as _PROCESS_INST_NO,'' as _ISSUE_DATE,'' as _DELIVERY_DATE, a.X_PO_NO as _Order_No,a.[X_GOODS_CD] as _GOODS_CD ,a.[X_GOODS_NAME1] as _GOODS_NAME ,
        CAST(X_QTY  as DECIMAL (38,2))  as _QTY,'' as RM_CD,'' as RM_NAME , '' as _UNIT,
            0.0 as RM_QTY
        FROM  [ENVIETNAMPO].[dbo].[_TBL_PO_M] a
END
ELSE
BEGIN 
    SELECT a._PROCESS_INST_NO,c._ISSUE_DATE,c._DELIVERY_DATE, a._Order_No,a._GOODS_CD,a._GOODS_NAME,CAST(a._QTY  as DECIMAL (38,2))  as _QTY,
            b._GOODS_CD as RM_CD,b._GOODS_NAME as RM_NAME,b._UNIT,
            (CASE  
                WHEN  LEFT(a._GOODS_NAME,2)='SS' OR LEFT(a._GOODS_NAME,2)='SN'  THEN
                CAST(a._QTY as DECIMAL (38,2)) * CAST(b._QTY  as DECIMAL (38,2))/ NULLIF(SUM(CAST(a._QTY AS decimal(38,2) )) OVER (PARTITION BY  a._Order_No ,b._GOODS_CD),0) 
            ELSE
                CAST(b._QTY  as DECIMAL (38,2))
            END) as  RM_QTY
        FROM [ENVNDIVDB].[dbo].[TBL_PROC_PM] a
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PMS] b
        ON a._PROCESS_INST_NO=b._PROCESS_INST_NO 
        INNER JOIN [ENVNDIVDB].[dbo].[TBL_PROC_PH] c
        ON a._PROCESS_INST_NO=c._PROCESS_INST_NO
        WHERE c._DELIVERY_DATE BETWEEN @startDate AND @endDate AND a._Order_No=@_Order_No

    UNION

    SELECT '' as _PROCESS_INST_NO,'' as _ISSUE_DATE,'' as _DELIVERY_DATE, a.X_PO_NO as _Order_No,a.[X_GOODS_CD] as _GOODS_CD ,a.[X_GOODS_NAME1] as _GOODS_NAME ,
            CAST(X_QTY  as DECIMAL (38,2))  as _QTY,'' as RM_CD,'' as RM_NAME , '' as _UNIT, 0.0 as RM_QTY
        FROM  [ENVIETNAMPO].[dbo].[_TBL_PO_M] a        
        WHERE a.X_PO_NO=@_Order_No
END

【问题讨论】:

    标签: sql-server sql-order-by union


    【解决方案1】:

    就这样做吧:

    SELECT _Order_No FROM (values(1), (2), (4), (6)) [first](_Order_No)
    UNION 
    SELECT _Order_No FROM (values(3), (7), (8), (5)) [second](_Order_No)
    ORDER BY _Order_No;
    

    输出:

    _Order_No
    -----------
    1
    2
    3
    4
    5
    6
    7
    8
    

    【讨论】:

    • 抱歉,我仍然无法将这个应用到我的查询中。你能帮我更多吗?谢谢!
    【解决方案2】:

    这是我的解决方案,它有效

    if(dbo.fn_LisIsActice()=1)
    begin
        select a, b, c from TableA
        union all
        select a, b, c from TableB   
    
               order by a
    
    
    end
    else
    begin
        select a, b, c from TableA order by a
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2014-09-26
      • 2010-09-17
      相关资源
      最近更新 更多