2014-01-16 69 views
0

我正在製作各種購物車應用程序,因此當用戶登錄時是否指定了他分配的任何東西OrderNumber。當他把他的車項目的順序存儲在數據庫中,像這樣:返回表中的所有列,但只返回特定列不同的行

+---+------------+-----------+------------+ 
|num|CustomerItem|OrderNumber|CustomerName| 
+---+------------+-----------+------------+ 
|1 |Candles  |12   |Dorothy  | 
+---+------------+-----------+------------+ 
|2 |Keyboard |11   |Kirk  | 
+---+------------+-----------+------------+ 
|3 |Lotion  |12   |Dorothy  | 
+---+------------+-----------+------------+ 
|4 |Monitor  |11   |Kirk  | 
+---+------------+-----------+------------+ 
|5 |Cups  |13   |Kathy  | 
+---+------------+-----------+------------+ 

現在,這是我想回到

+---+------------+-----------+------------+ 
|num|CustomerItem|OrderNumber|CustomerName| 
+---+------------+-----------+------------+ 
|4 |Monitor  |11   |Kirk  | 
+---+------------+-----------+------------+ 
|1 |Candles  |12   |Dorothy  | 
+---+------------+-----------+------------+ 
|5 |Cups  |13   |Kathy  | 
+---+------------+-----------+------------+ 

這些聲明是什麼,我都試了一下:

select * from [mytable] where 
[OrderNumber] in (Select max(OrderNumber) FROM [mytable] group by OrderNum) 

而且

select * from [mytable] where 
[OrderNumber] in (Select Distinct OrderNumber FROM [mytable] group by OrderNum) 

無論語句將工作,他們都顯示重複的OrderNumber

+0

您需要爲我們提供一個規則,並最終爲SQL Server提供一個規則,以便爲特定的'OrderNumber'選擇其他列值。它應該是具有最高'num'值的行的所有列值嗎?它應該是什麼'MAX()'返回每列。定義一個規則,它必須基於這些列中可用的數據。 –

+0

(我意識到我的第一個建議與您所需的輸出不匹配,因爲它會返回具有num-3而不是1的行) –

回答

0

你可能想嘗試這樣的:

SELECT * 
FROM [mytable] 
WHERE ([OrderNumber], num) IN (
    SELECT OrderNumber, max(Numb) 
    FROM [mytable] 
    GROUP BY OrderNum 
) 
0

我認爲你正在尋找不同的http://www.w3schools.com/sql/sql_distinct.asp

select distinct customeritem ,ordernnumber,customername 
from [mytable] 

這將對訂購的物品列出不合格的清單。你會以這種方式放棄num(PK)列,但沒有真正的方法來獲得它的獨特性,因此它不會是重複的。您可以添加一個組和一個數(*)以獲得他們訂購的數量

0

如果您想要某個特定OrderNumber的值最高的num的值(這與您的預期結果不符,但您已經尚未闡明的規則),則:

; With Ordered as (
Select *, 
ROW_NUMBER() OVER (PARTITION BY OrderNum 
        ORDER BY num desc) as rn 
FROM [mytable] 
) 
select * from Ordered where rn = 1 

ROW_NUMBER

0

由於客戶名稱是每ORDERNUMBER每一行一樣,你需要做的規則來確定WH ich Num and CustomerItem將被退回。

但是看着你想要的樣本輸出,你可以爲每個輸出使用不同的邏輯規則。

例子:

[Num]  [CustomerItem]  [OrderNumber]  [CustomerName] 
1   Candles    12     Dorothy 
2   Keyboard   11     Kirk 
3   Lotion    12     Dorothy 
4   Monitor    11     Kirk 

您想退掉這兩:

4   Monitor    11     Kirk  
1   Candles    12     Dorothy 

現在對於監視器,無論是民與CustomerItem代表所使用的任何字段的降序排列的第一個結果訂購它。對於蠟燭,Num和CustomerItem均表示升序。所以要麼我們不知道排序的另一個原因,要麼你要求的是不合邏輯的。

否則,你可以簡單地做這樣的事情,例如:

select DISTINCT CA.* 
from [mytable] MT 
CROSS APPLY (SELECT TOP 1 * FROM mytable T2 WHERE T2.OrderNumber = MT.OrderNumber ORDER BY T2.Num asc) CA 

這將返回的第一行各組OrderNumbers的,由民有序。對於更大的表,將myTable連接到具有GROUP BY OrderNumber和MAX(Num)的子查詢,將這兩個值用作連接值,將創建相同的結果,但效率更高。