2017-09-13 19 views
0

我想用UNION对以下查询的Order No进行排序,但它不能完成,虽然使用Google搜索很多。使用带有UNION和ALIASES的ORDER BY以及复杂的查询

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 [email protected]_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 [email protected]_Order_No 
END 

回答

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 
+0

很抱歉,但我还是不能应用此一个进入我的查询。你能帮我多些吗?谢谢! – user3035133

0

这里是我的解决方案,它的工作原理

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