我正在制作各种购物车应用程序,因此当用户登录他是否订购任何东西时,他被分配了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 :(得分: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)的子查询,使用这两个作为连接值,将创建相同的结果,但效率更高。