这里有发票明细表。
我需要所有值而不重复[invoiceno]
。
我正在尝试
select distinct invoiceno,name,addr1,addr2,id from invoice_table;
结果:
invoiceno name addr1 addr2 id
2016718001 Severus Sanpe 7,Hogwards, Sevilee,USA 7451 5
2016718002 Severus Sanpe 7,Hogwards, Sevilee,USA 7451 8
2016718002 Severus Sanpe 7,Hogwards, Sevilee,USA 7451 9
我想要结果:
invoiceno name addr1 addr2 id
2016718001 Severus Sanpe 7,Hogwards, Sevilee,USA 7451 5
2016718002 Severus Sanpe 7,Hogwards, Sevilee,USA 7451 8
id
中没有SELECT
的情况下工作正常。但我也需要这个。
怎么做?
答案 0 :(得分:4)
如果您不希望invoiceno
重复,那么典型的方法是使用row_number()
:
select iv.*
from (select iv.*, row_number() over (partition by invoiceno order by id desc) as seqnum
from invoice_table iv
) iv
where seqnum = 1 ;
您误解了select distinct
的工作原理。它适用于select
列表中所有列(和表达式),包括id
。
答案 1 :(得分:3)
您可能希望使用MIN聚合函数进行GROUP BY查询:
select
invoiceno, name, addr1, addr2, min(id) as id
from
invoice_table
group by
invoiceno, name, addr1, addr2
如果同一张发票可以有多个名称和/或地址,您可以使用以下内容:
select t.invoiceno, t.name, t.addr1, t.addr2, t.id
from
invoice_table t inner join (select invoiceno, min(id) as min_id) m
on t.invoiceno=m.invoiceno and t.id=m.min_id
这将为每个invoiceno返回第一个id(值最小的id)。
答案 2 :(得分:2)
您似乎每张发票只需要输入一次。 假设它是SQL Server 2008或更高版本
select * from (
select invoiceno,name,addr1,addr2,id, Row_number() over( partition by invoiceno order by invoiceno) RN from invoice_table
) a where Rn=1
答案 3 :(得分:0)
DISTINCT
关键字适用于完整的结果集:invoiceno,name,addr1,addr2,id
。第2行和第3行在id字段不同,因此它们将是不同的。
有两种选择:
显然,你可以跳过这样的id字段:
select distinct invoiceno,name,addr1,addr2 from invoice_table;
分组有点棘手:
select invoiceno,name,addr1,addr2,id -- no distinct
from invoice_table
where id in (
select min(id) from invoice_table
group by invoiceno -- we have this group by + min instead of the distinct keyword
)
第二个可能会对您的表现产生负面影响,所以要小心。
答案 4 :(得分:0)
SELECT * FROM invoice_table其中ID IN(
SELECT MIN(ID)FROM invoice_table
GROUP BY invoiceno,name,addr1,addr2)