[英]MS Access Union, Order By mess up my query order
SQL:
SELECT
SUM(dbo_SO_SalesHistory.DollarsSold) AS SumDollarsSold,
"PHOA" As CustomerNo
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.[CustomerNo]) IN ("PHOM","PHOB", "PHOA", "HOMP"))
AND ((dbo_SO_SalesHistory.InvoiceDate) BETWEEN [BeginDate] AND [EndDate])
UNION
SELECT TOP 9
SUM(DollarsSold), CustomerNo
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.CustomerNo) NOT IN ("PHOM","PHOB", "PHOA", "HOMP"))
AND ((dbo_SO_SalesHistory.InvoiceDate) BETWEEN [BeginDate] AND [EndDate])
GROUP BY
dbo_SO_SalesHistory.CustomerNo
ORDER BY
1 DESC;
當我分別運行兩個查詢時,查詢的第二部分將返回我期望的輸出:
但是當我將它與UNION
一起運行時,順序卻以某種方式混淆了:
在代碼ORDER BY 1 DESC
, 1
表示第一列,即總和。
我努力了
ORDER BY SUM(dbo_SO_SalesHistory.DollarsSold) DESC;
而是返回一個錯誤:
任何建議將不勝感激!
更新 :這是當前查詢輸出:
[ ]
所需的輸出如下所示:
(我從圖片1中剪切並粘貼了2〜10行)。 希望這對您的理解有所幫助!
我當前的查詢:
Sum of Dollar | Customer
--------------+----------
10 | A
8 | B
1 | Q
所需的查詢輸出
14 | B_Total
10 | A
5 | C
B_Total(14)是X(4),Y(3),Z(2)和B(5)的總和
更新:當前查詢
SELECT
SumDollarsSold, CustomerNo, MyOrder
FROM
(SELECT
SUM(dbo_SO_SalesHistory.DollarsSold) AS SumDollarsSold,
"PHOALLE" AS CustomerNo, 1 AS MyOrder
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.[CustomerNo]) IN ("PHOMIN","PHOALLE","PHOBROO","PHOMP"))
AND ((dbo_SO_SalesHistory.InvoiceDate) Between [BeginDate] And [EndDate])
UNION
SELECT TOP 9
SUM(DollarsSold), CustomerNo, 2 as MyOrder
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.CustomerNo) NOT IN ("PHOM","PHOA","PHOB","PHOM"))
AND ((dbo_SO_SalesHistory.InvoiceDate) Between [BeginDate] And [EndDate])
GROUP BY
dbo_SO_SalesHistory.CustomerNo
ORDER BY
1 DESC
) a
ORDER BY
MyOrder, SumDollarsSold DESC;
當您使用UNION時,無法保證任何訂單,因此您將丟失在第二個查詢中已經完成的ORDER BY。 您可以添加另一個字段,以確保第一條記錄始終位於最前面,但是您確實需要將其包括在所選字段中。 像這樣:
SELECT
SumDollarsSold, CustomerNo, MyOrder
FROM
(SELECT
SUM(dbo_SO_SalesHistory.DollarsSold) AS SumDollarsSold,
"PHOA" AS CustomerNo, 1 AS MyOrder
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.[CustomerNo]) IN ("PHOM","PHOB", "PHOA", "PHOM"))
AND ((dbo_SO_SalesHistory.InvoiceDate) Between [BeginDate] And [EndDate])
UNION
(SELECT TOP 9
SUM(DollarsSold), CustomerNo, 2 as MyOrder
FROM
dbo_SO_SalesHistory
WHERE
((dbo_SO_SalesHistory.CustomerNo) NOT IN ("PHOM","PHOB", "PHOA", "PHOM"))
AND ((dbo_SO_SalesHistory.InvoiceDate) Between [BeginDate] And [EndDate])
GROUP BY
dbo_SO_SalesHistory.CustomerNo
ORDER BY
SUM(DollarsSold) DESC)
) a
ORDER BY
MyOrder, SumDollarsSold DESC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.