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

时间:2016-01-26 14:19:38

标签: sql union

尝试弄清楚如何让我的数据首先返回SELECT数据,然后在下面显示UNION数据。目前它正在返回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

3 个答案:

答案 0 :(得分:1)

在下面的代码示例中引入一个人工排序键列(我将其称为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

答案 1 :(得分:0)

您可以添加自己的列:

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

答案 2 :(得分:0)

你的查询,正如所写,真的没有意义。除了某些光栅习惯(例如对列别名使用单引号,没有VARCHAR()的长度),它的效率非常低。它为最后两个子查询创建多个行,仅在UNION中删除它们。

通常,最好使用UNION ALL而不是UNION。我想你想要这样的东西:

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