繁体   English   中英

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

[英]Return all columns from a table but only return rows where a specific column is distinct

我正在制作各种购物车应用程序,因此,当用户登录是否订购商品时,会OrderNumber分配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列中显示重复项

您可能想尝试类似的方法:

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

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

select distinct customeritem ,ordernnumber,customername
from [mytable] 

这将列出所有订购的物品。 您将以这种方式释放num(PK)列,但没有真正的方法来获得它,因为它将是唯一的,因此不会重复。 您可以添加一个group by和一个count(*)以获取他们订购的数量

如果您想要特定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

由于每个OrderNumber的每一行的CustomerName都相同,因此您需要制定一条规则来确定将返回哪个NumCustomerItem

但是,查看所需的样本输出后,您将为每个样本使用不同的逻辑规则。

例:

[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

现在,对于Monitor ,Num和CustomerItem都以降序表示第一个结果,无论您使用哪个字段对其进行排序。 对于Candles ,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返回第一行,按Num排序。 对于较大的表,将myTable联接到具有GROUP BY OrderNumber和MAX(Num)的子查询,使用这两个作为联接值,将创建相同的结果,但效率更高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM