请问下,某个字段重复了,怎么让结果只显示一条数据啊

时间:2022-01-18 14:47:32
请问下,某个字段重复了,怎么让结果只显示一条数据啊

RefundTicketId是主键,但是我我想让PSerialNumber重复的只显示一条,

SELECT RefundTicketId,
   PSerialNumber ,
   PaymentAmount,
   PosStatus,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
这是现在的sql语句,请问下该怎么实现啊


16 个解决方案

#1


select * from (
SELECT 
RefundTicketId,
PSerialNumber ,
PaymentAmount,
PosStatus,
count(*) over( partition by PSerialNumber) AS TotalCnt,
sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt,
row_number()over(partition by PSerialNumber order by PSerialNumber)as ID
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
)as a where a.id=1
这是方式可以实现,但因某种原因无法使用,请问下还有他方法吗

#2



你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于

#3


引用 2 楼 yupeigu 的回复:
你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错

#4


引用 3 楼 obliviousSing 的回复:
Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?

#5


引用 4 楼 yupeigu 的回复:
Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

#6


引用 5 楼 obliviousSing 的回复:
Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊

#7


引用 6 楼 obliviousSing 的回复:
Quote: 引用 5 楼 obliviousSing 的回复:

Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊


2008的话,你上面的代码也可以用的,你上面的写法就是一种简化的写法,如果直接用group by,那sql语句就会更加复杂了

#8


引用 7 楼 yupeigu 的回复:
Quote: 引用 6 楼 obliviousSing 的回复:

Quote: 引用 5 楼 obliviousSing 的回复:

Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊


2008的话,你上面的代码也可以用的,你上面的写法就是一种简化的写法,如果直接用group by,那sql语句就会更加复杂了

上面的代码在数据库是可以直接运行的,结果也是对的,但是公司后台不是直接写的sql语句,是按照某种格式拼接起来的,但是那种写法,貌似拼接不起来,所以才问下,有没有其他的写法

#9


做个视图吧,这样后台最简单的 SELECT 语句总可拼出来吧。

最做的设计?
既然后台有这样的限制,数据库业务设计就应该让PSerialNumber只保留一个RefundTicketId记录。
否则性能堪忧啊。

#10


引用 9 楼 Tiger_Zhao 的回复:
做个视图吧,这样后台最简单的 SELECT 语句总可拼出来吧。

最做的设计?
既然后台有这样的限制,数据库业务设计就应该让PSerialNumber只保留一个RefundTicketId记录。
否则性能堪忧啊。


啥视图啊,其实功能是这样的, 界面上只显示PSerialNumber的一条数据,但是点进去以后,就要把所有的PSerialNumber数据显示出来,你说的我没咋听懂。。。。sql基础太差了。

#11


CREATE VIEW V_ReClaimsTransferRefundTicket
SELECT PSerialNumber ,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
GROUP BY PSerialNumber 

用上面的语句创建视图
界面上先从 V_ReClaimsTransferRefundTicket 取数据(每个PSerialNumber 只显示一条数据),
“点进去以后”,就用 PSerialNumber 为条件从 tb_ReClaimsTransferRefundTicket 取明细数据。

明明是两句不同的查询而已,很简单的事情非要搞复杂 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#12


引用 11 楼 Tiger_Zhao 的回复:
CREATE VIEW V_ReClaimsTransferRefundTicket
SELECT PSerialNumber ,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
GROUP BY PSerialNumber 

用上面的语句创建视图
界面上先从 V_ReClaimsTransferRefundTicket 取数据(每个PSerialNumber 只显示一条数据),
“点进去以后”,就用 PSerialNumber 为条件从 tb_ReClaimsTransferRefundTicket 取明细数据。

明明是两句不同的查询而已,很简单的事情非要搞复杂 请问下,某个字段重复了,怎么让结果只显示一条数据啊


运行咋报错了。。。单独运行,分开运行都报错

#13


用partition分组排序后取1就行了

#14


引用 12 楼 obliviousSing 的回复:
运行咋报错了。。。单独运行,分开运行都报错 

SELECT 前面加一个 AS 语句,最后加一个 GO 语句 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#15


引用 13 楼 xiaoxiangqing 的回复:
用partition分组排序后取1就行了


大哥有空能给点代码吗。。。还是不会。 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#16



SELECT a.* FROM
(SELECT RefundTicketId,
   PSerialNumber ,
   PaymentAmount,
   PosStatus,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]) a,
(SELECT max(RefundTicketId) AS RefundTicketId FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket] GROUP BY PSerialNumber) b
WHERE a.RefundTicketId=b.RefundTicketId

#1


select * from (
SELECT 
RefundTicketId,
PSerialNumber ,
PaymentAmount,
PosStatus,
count(*) over( partition by PSerialNumber) AS TotalCnt,
sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt,
row_number()over(partition by PSerialNumber order by PSerialNumber)as ID
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
)as a where a.id=1
这是方式可以实现,但因某种原因无法使用,请问下还有他方法吗

#2



你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于

#3


引用 2 楼 yupeigu 的回复:
你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错

#4


引用 3 楼 obliviousSing 的回复:
Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?

#5


引用 4 楼 yupeigu 的回复:
Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

#6


引用 5 楼 obliviousSing 的回复:
Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊

#7


引用 6 楼 obliviousSing 的回复:
Quote: 引用 5 楼 obliviousSing 的回复:

Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊


2008的话,你上面的代码也可以用的,你上面的写法就是一种简化的写法,如果直接用group by,那sql语句就会更加复杂了

#8


引用 7 楼 yupeigu 的回复:
Quote: 引用 6 楼 obliviousSing 的回复:

Quote: 引用 5 楼 obliviousSing 的回复:

Quote: 引用 4 楼 yupeigu 的回复:

Quote: 引用 3 楼 obliviousSing 的回复:

Quote: 引用 2 楼 yupeigu 的回复:


你是一方面只取出一条记录,另一方面又要对PSerialNumber相同的求和汇总,求记录的条数。

但是这种写法只是在2005以后的版本才有。

你可以这么写,首先取出PSerialNumber相同的一条记录,然后 在按照 PSerialNumber 分组group by汇总,然后再进行关联,类似于
 sql太差了。。。 请问下,能稍微再详细点吧,貌似不能用group by...我试了会出错


你用的是sql 2000吗?


用的sql2008

因为查询的字段太多了。group by感觉不好用啊


2008的话,你上面的代码也可以用的,你上面的写法就是一种简化的写法,如果直接用group by,那sql语句就会更加复杂了

上面的代码在数据库是可以直接运行的,结果也是对的,但是公司后台不是直接写的sql语句,是按照某种格式拼接起来的,但是那种写法,貌似拼接不起来,所以才问下,有没有其他的写法

#9


做个视图吧,这样后台最简单的 SELECT 语句总可拼出来吧。

最做的设计?
既然后台有这样的限制,数据库业务设计就应该让PSerialNumber只保留一个RefundTicketId记录。
否则性能堪忧啊。

#10


引用 9 楼 Tiger_Zhao 的回复:
做个视图吧,这样后台最简单的 SELECT 语句总可拼出来吧。

最做的设计?
既然后台有这样的限制,数据库业务设计就应该让PSerialNumber只保留一个RefundTicketId记录。
否则性能堪忧啊。


啥视图啊,其实功能是这样的, 界面上只显示PSerialNumber的一条数据,但是点进去以后,就要把所有的PSerialNumber数据显示出来,你说的我没咋听懂。。。。sql基础太差了。

#11


CREATE VIEW V_ReClaimsTransferRefundTicket
SELECT PSerialNumber ,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
GROUP BY PSerialNumber 

用上面的语句创建视图
界面上先从 V_ReClaimsTransferRefundTicket 取数据(每个PSerialNumber 只显示一条数据),
“点进去以后”,就用 PSerialNumber 为条件从 tb_ReClaimsTransferRefundTicket 取明细数据。

明明是两句不同的查询而已,很简单的事情非要搞复杂 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#12


引用 11 楼 Tiger_Zhao 的回复:
CREATE VIEW V_ReClaimsTransferRefundTicket
SELECT PSerialNumber ,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]
GROUP BY PSerialNumber 

用上面的语句创建视图
界面上先从 V_ReClaimsTransferRefundTicket 取数据(每个PSerialNumber 只显示一条数据),
“点进去以后”,就用 PSerialNumber 为条件从 tb_ReClaimsTransferRefundTicket 取明细数据。

明明是两句不同的查询而已,很简单的事情非要搞复杂 请问下,某个字段重复了,怎么让结果只显示一条数据啊


运行咋报错了。。。单独运行,分开运行都报错

#13


用partition分组排序后取1就行了

#14


引用 12 楼 obliviousSing 的回复:
运行咋报错了。。。单独运行,分开运行都报错 

SELECT 前面加一个 AS 语句,最后加一个 GO 语句 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#15


引用 13 楼 xiaoxiangqing 的回复:
用partition分组排序后取1就行了


大哥有空能给点代码吗。。。还是不会。 请问下,某个字段重复了,怎么让结果只显示一条数据啊

#16



SELECT a.* FROM
(SELECT RefundTicketId,
   PSerialNumber ,
   PaymentAmount,
   PosStatus,
   count(*) over( partition by PSerialNumber) AS TotalCnt,
   sum(PaymentAmount) over( partition by PSerialNumber) AS TotalAmt,
   sum(case when PosStatus='已保全' then 1 else 0 end)over(partition by PSerialNumber) AS POSCnt,
   sum(case when PosStatus='已转账' then 1 else 0 end)over(partition by PSerialNumber) AS TranCnt,
   sum(case when PosStatus='已转账' then PaymentAmount else 0 end) over( partition by PSerialNumber) AS TranAmt
FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket]) a,
(SELECT max(RefundTicketId) AS RefundTicketId FROM [CHCPay_DB].[dbo].[tb_ReClaimsTransferRefundTicket] GROUP BY PSerialNumber) b
WHERE a.RefundTicketId=b.RefundTicketId