2013-10-07 54 views
0

我有以下代碼:SQL:如何顯示不按表達式分組的列?

select O.ONO 
from Customers C, Odetails Od, Orders O, Parts P 
where P.PNO=Od.PNO and Od.ONO=O.ONO and O.CNO=C.CNO 
group by O.ONO 
order by sum(Od.QTY*P.PRICE)desc; 

然而,代替選擇O.ONO柱,我需要從不同的表中選擇C.CNAME。我會怎麼做呢?

+0

你應該加入一個現代風格 - 由30年過時? – Hogan

+0

@ user2853262 Hogan的含義是'...來自Customers C INNER JOIN Orders O ON C.CNO = O.CNO ...'的連接語法更容易傳達查詢的意圖。 –

回答

1

如果你想要的是他們的訂單和訂購然後就從

select O.ONO 
... 
group by O.ONO 

select C.CName 
... 
group by C.CName 

這將顯示用戶名和更改您的查詢的客戶名稱的列表訂單號。注意:這將多次重複的客戶名稱,因爲有該客戶

訂單還有,我的SQL查詢的首選風格是

select C.CName 
from Customers C 
    INNER JOIN Orders O ON C.CNO = O.CNO 
    INNER JOIN Odetails OD ON O.ONO = OD.ONO 
    INNER JOIN Parts P ON OID.PNO = P.PNO 
where P.PNO=Od.PNO and Od.ONO=O.ONO and O.CNO=C.CNO 
group by C.CName 
order by sum(Od.QTY*P.PRICE)desc; 

另外一個建議,闡明你的代碼。 (請注意:我不是oracle人),在我的公司(SqlServer)中,一般情況下,您將擁有以實體命名的表,主鍵只是Id,然後是任何以前綴命名的屬性。例如OID是指OrderId還是OfficeId

EG:

客戶:

  • 編號
  • 名稱

訂單:

  • 編號
  • 客戶編號

然後你的查詢更具可讀性:

SELECT Name 
FROM Customer 
    INNER JOIN Order ON Customer.Id = Order.CustomerId 
WHERE ... 
ORDER BY Customer.Name 
+0

我唯一的問題是我需要通過'O.ONO'對它們進行分組,因爲訂單具有與它們相關的多個零件編號(Odetails的主鍵是「ONO」和「PNO」)不確定這是否有意義 – user2853262

+0

因此包括O.ONO在select和group by子句 –

+0

@ user2853262實際上,你*只是*想顯示列表中的客戶?或者*還*顯示列表中的訂單號碼? –

0

請不要這樣,

select C.CNAME from Customers C, Odetails Od, Orders O, Parts P where P.PNO=Od.PNO and Od.ONO=O.ONO and O.CNO=C.CNO group by C.CNAME order by sum(Od.QTY*P.PRICE) desc; 
0

select語句將選擇指定的列

SELECT C.CNAME 
FROM Customers C, Odetails Od, Orders O, Parts P 
WHERE P.PNO=Od.PNO and Od.ONO=O.ONO and O.CNO=C.CNO 
GROUP BY C.CNAME 
ORDER BY sum(Od.QTY*P.PRICE)desc; 

如果你想聖虐待保持O.ONO列

SELECT C.CNAME, O.ONO 
FROM Customers C, Odetails Od, Orders O, Parts P 
WHERE P.PNO=Od.PNO and Od.ONO=O.ONO and O.CNO=C.CNO 
GROUP BY C.CNAME 
ORDER BY sum(Od.QTY*P.PRICE)desc;