尝试弄清楚如何让我的数据首先返回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
答案 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