SQL - UNION - 如何处理返回的数据

SQL - UNION - How to Manipulate Data Returned

试图弄清楚如何先将我的数据获取到 return SELECT 数据,然后在下面显示 UNION 数据。目前它是 return 前两行的 UNION 数据和后面的 SELECT 数据。我需要顶部的 SELECT 和底部的 UNION。尝试了几种方法,但没有任何效果。

 SELECT 
                    Record_Time_Stamp AS 'Record_Time_Stamp', 
                    Car_ID, 
                    Commodity, 
                    CAST(Transaction_Num AS NVARCHAR(MAX)) AS 'Transaction_Num', 
                    CAST(Weight_Out AS NVARCHAR(MAX)) AS 'Gross_Wt', 
                    CAST(Weight_In AS NVARCHAR(MAX)) AS 'Tare_Wt', 
                    CAST(abs(Weight_In - Weight_Out) AS NVARCHAR) AS 'Net_Wt'
                FROM 
                    dbo.Transactions_Truck 
                WHERE 
                    (Date_Weighed_Out between @BegDate and @EndDate) AND
                    Vendor = @Vendor
            UNION
                SELECT
                        GETDATE() AS Record_Time_Stamp,
                        '' AS Car_ID,
                        '' AS Commodity,
                        'Total Tons' AS 'Transaction_Num',
                        '' AS 'Gross_Wt',
                        '' AS 'Tare_Wt',
                        @Total_Tons AS 'Net_Wt'
                    FROM
                        dbo.Transactions_Truck 
            UNION
                SELECT
                    GETDATE() AS Record_Time_Stamp,
                    '' AS Car_ID,
                    '' AS Commodity,
                    'Total Lbs.' AS 'Transaction_Num',
                    '' AS 'Gross_Wt',
                    '' AS 'Tare_Wt',
                    @Total_Lbs AS 'Net_Wt'
                FROM
                    dbo.Transactions_Truck 
                ORDER BY 
                    Transaction_Num

引入一个人工排序键列(我将在下面的代码示例中称之为 MySortKey)以保持两个选择分开。

SELECT 
                Record_Time_Stamp AS 'Record_Time_Stamp', 
                Car_ID, 
                Commodity, 
                CAST(Transaction_Num AS NVARCHAR(MAX)) AS 'Transaction_Num', 
                CAST(Weight_Out AS NVARCHAR(MAX)) AS 'Gross_Wt', 
                CAST(Weight_In AS NVARCHAR(MAX)) AS 'Tare_Wt', 
                CAST(abs(Weight_In - Weight_Out) AS NVARCHAR) AS 'Net_Wt',
                1 AS MySortKey
            FROM 
                dbo.Transactions_Truck 
            WHERE 
                (Date_Weighed_Out between @BegDate and @EndDate) AND
                Vendor = @Vendor
        UNION
            SELECT
                    GETDATE() AS Record_Time_Stamp,
                    '' AS Car_ID,
                    '' AS Commodity,
                    'Total Tons' AS 'Transaction_Num',
                    '' AS 'Gross_Wt',
                    '' AS 'Tare_Wt',
                    @Total_Tons AS 'Net_Wt',
                    2 AS MySortKey
                FROM
                    dbo.Transactions_Truck 
        UNION
            SELECT
                GETDATE() AS Record_Time_Stamp,
                '' AS Car_ID,
                '' AS Commodity,
                'Total Lbs.' AS 'Transaction_Num',
                '' AS 'Gross_Wt',
                '' AS 'Tare_Wt',
                @Total_Lbs AS 'Net_Wt'
            FROM
                dbo.Transactions_Truck 
            ORDER BY 
                MySortKey, Transaction_Num

您可以添加自己的专栏:

SELECT ..., 1 AS query_num
FROM ...
UNION 
SELECT ..., 2 AS query_num
FROM ...
UNION
SELECT ..., 3 AS query_num
FROM ...
ORDER BY query_num, ...

请记住,添加列会绕过 UNION 区别,因此您可以更改它 UNION ALL

您的查询,正如所写的那样,确实没有任何意义。除了某些格栅习惯(例如对列别名使用单引号,没有 VARCHAR() 的长度),它是非常低效的。它正在为最后两个子查询创建多行,只是为了在 UNION.

中删除它们

一般来说,用UNION ALLUNION好。我想你想要这样的东西:

SELECT Record_Time_Stamp, Car_ID, Commodity, 
       CAST(Transaction_Num AS NVARCHAR(MAX)) AS Transaction_Num, 
       CAST(Weight_Out AS NVARCHAR(MAX)) AS Gross_Wt, 
       CAST(Weight_In AS NVARCHAR(MAX)) AS Tare_Wt, 
       CAST(abs(Weight_In - Weight_Out) AS NVARCHAR(32)) AS Net_Wt
FROM dbo.Transactions_Truck 
WHERE (Date_Weighed_Out between @BegDate and @EndDate) AND
      Vendor = @Vendor
UNION ALL
SELECT GETDATE() AS Record_Time_Stamp, '' AS Car_ID, '' AS Commodity,
       'Total Tons' AS Transaction_Num,
       '' AS 'Gross_Wt', '' AS Tare_Wt, @Total_Tons AS Net_Wt
UNION ALL
SELECT GETDATE() AS Record_Time_Stamp, '' AS Car_ID,'' AS Commodity,
       'Total Lbs.' AS Transaction_Num, '' AS Gross_Wt, '' AS Tare_Wt,
        @Total_Lbs AS Net_Wt;

这可能会在实践中达到您想要的效果。但是,我建议添加一个 ORDER BY 子句,例如:

ORDER BY (CASE WHEN Car_ID = '' THEN 2 ELSE 1 END),
         Transaction_Num