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 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
试图弄清楚如何先将我的数据获取到 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 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