返回表中的所有列,但仅返回特定列不同的行

时间:2014-01-16 11:32:45

标签: sql sql-server

我正在制作各种购物车应用程序,因此当用户登录他是否订购任何东西时,他被分配了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

中显示重复

4 个答案:

答案 0 :(得分:0)

你可能想尝试类似的东西:

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

答案 1 :(得分:0)

我认为你正在寻找不同的http://www.w3schools.com/sql/sql_distinct.asp

select distinct customeritem ,ordernnumber,customername
from [mytable] 

这将列出所订购商品的详细清单。你将以这种方式放弃num(PK)列但是没有真正的方法来获得它因为它将是唯一的,所以它不会是重复的。您可以添加一个组和一个计数(*)来获取他们订购的数量

答案 2 :(得分:0)

如果您希望特定num具有最高OrderNumber值的行(这与您的预期结果不符,但您还没有明确规定),那么:

; 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

答案 3 :(得分:0)

由于每个订单号的每一行的客户名称相同,您需要制定一个规则来确定哪个 Num 将返回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

现在,对于监视器,Num和CustomerItem都以递减顺序表示第一个结果,无论您使用哪个字段进行订购。对于蜡烛,Num和CustomerItem都代表ASCENDING订单。所以要么我们不知道订购的另一个原因,或者你要求的是不合逻辑的。

否则你可以简单地做一些这样的事情:

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组的第一行,由Num排序。对于更大的表,将myTable连接到具有GROUP BY OrderNumber和MAX(Num)的子查询,使用这两个作为连接值,将创建相同的结果,但效率更高。