如何去掉多余的数据

sdjackal 2011-08-09 09:55:26
01A 02A 03A 04A 05A 06A 07A 08A 09A 10A 11A 12A SalesRepCode Name
0 0 0 0 0 0 0 0 0 0 0 0 1027 SSS
123 2 35 5 6 7 8 3 0 0 0 0 1001 DDD
0 0 0 0 0 0 0 0 0 0 0 0 1001 QQQ
122 0 35 5 6 7 8 3 0 0 0 0 1008 BBB

这样一个表,保留01A~12A任意一列为非0,或者SalseRepCode = 1001的行。
我的意思就是这个表要去掉第一行
...全文
135 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chtzhking 2011-08-10
  • 打赏
  • 举报
回复
Sorry 我不知道你用的是什么,看你的代码,我只知道那里有问题,静待高人
sdjackal 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 chtzhking 的回复:]
条件后面这个('01A' + '02A' + '03A' + '04A' + '05A' + '06A' + '07A' + '08A' + '09A' + '10A' + '11A' + '12A')错了吧
是不是应该写成([01A]+[02A]+[03A]+[04A]+[05A+[06A]+[07A]+[08A]+[09A]+[10A]+[11A]+[12A])<>0

SQL code……
[/Quote]
不要纠结与语法,我用的不是MSSQL,但是论坛CSDN没有progress板块,我只好发到这里了
chtzhking 2011-08-10
  • 打赏
  • 举报
回复
条件后面这个('01A' + '02A' + '03A' + '04A' + '05A' + '06A' + '07A' + '08A' + '09A' + '10A' + '11A' + '12A')错了吧
是不是应该写成([01A]+[02A]+[03A]+[04A]+[05A+[06A]+[07A]+[08A]+[09A]+[10A]+[11A]+[12A])<>0

print '01A' + '02A' + '03A' + '04A' + '05A' + '06A' + '07A' + '08A' + '09A' + '10A' + '11A' + '12A'
----------------------------------
01A02A03A04A05A06A07A08A09A10A11A12A
sdjackal 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 acherat 的回复:]
SQL code

create table tb
(
[01A] int,[02A] int,[03A] int,[04A] int,[05A] int,[06A] int,[07A] int,[08A] int,
[09A] int,[10A] int,[11A] int,[12A] int,SalesRepCode varchar(10),Name varchar(10)
)
……
[/Quote]


select * from
(select
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 1 THEN ShipQty ELSE 0 END,2)) AS '01A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 2 THEN ShipQty ELSE 0 END,2)) AS '02A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 3 THEN ShipQty ELSE 0 END,2)) AS '03A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 4 THEN ShipQty ELSE 0 END,2)) AS '04A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 5 THEN ShipQty ELSE 0 END,2)) AS '05A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 6 THEN ShipQty ELSE 0 END,2)) AS '06A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 7 THEN ShipQty ELSE 0 END,2)) AS '07A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 8 THEN ShipQty ELSE 0 END,2)) AS '08A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 9 THEN ShipQty ELSE 0 END,2)) AS '09A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 10 THEN ShipQty ELSE 0 END,2)) AS '10A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 11 THEN ShipQty ELSE 0 END,2)) AS '11A',
SUM(ROUND(CASE WHEN Month(T1.ShipDate) = 12 THEN ShipQty ELSE 0 END,2)) AS '12A',
Customer.SalesRepCode,Customer.name--,Customer.ShortChar01
from PUB.Customer
left join
(
select ShipHead.ShipDate,case when ShipDtl.PartNum = 'SXF01' then 0 else ShipDtl.OurInventoryShipQty end as ShipQty,ShipDtl.PartNum,OrderHed.OrderNum,OrderHed.SalesRepList,OrderHed.CustNum
from PUB.ShipHead
inner join PUB.ShipDtl on ShipHead.PackNum = ShipDtl.PackNum and ShipHead.Company = ShipDtl.Company
inner join PUB.OrderHed on ShipDtl.OrderNum = OrderHed.OrderNum and ShipDtl.Company = OrderHed.Company
inner join PUB.SalesRep on SalesRep.SalesRepCode = OrderHed.SalesRepList and SalesRep.Company = OrderHed.Company
where ShipHead.Company = 'Tube' and shipHead.ReadyToInvoice = 1 and ShipHead.ShipDate between '2011-1-1' and '2011-7-31' and OrderHed.SalesRepList = '1001' and SalesRep.Character01 = '104'
union all
select RMAHead.RMADate,case when RMADtl.PartNum = 'SXF01' then 0 else RMADtl.OurReturnQty * -1 end as ShipQty,RMADtl.PartNum,RMAHead.RMANum as OrderNum,OrderHed.SalesRepList,OrderHed.CustNum
from PUB.RMAHead
inner join PUB.RMADtl on RMAHead.RMANum = RMADtl.RMANum and RMAHead.Company = RMADtl.Company
inner join PUB.OrderHed on RMADtl.OrderNum = OrderHed.OrderNum and RMADtl.company = OrderHed.company
inner join PUB.SalesRep on SalesRep.SalesRepCode = OrderHed.SalesRepList and SalesRep.Company = OrderHed.Company
where RMAHead.Company = 'tube' and RMAHead.RMADate between '2011-1-1' and '2011-7-31'
and OrderHed.SalesRepList = '1001' and SalesRep.Character01 = '104'
) T1 on T1.CustNum = Customer.CustNum
where customer.Company = 'Tube'
group by Customer.name,Customer.SalesRepCode
) T2
where T2.SalesRepCode = '1001' or ('01A' + '02A' + '03A' + '04A' + '05A' + '06A' + '07A' + '08A' + '09A' + '10A' + '11A' + '12A') <> 0

我是没折了,T2查出的数据跟我提出的样例是差不多的(一共4315条记录),其中有用的大概占25%,以最后那个条件过滤后,还是得出原表,你能看出有什么语病吗?
AcHerat 2011-08-09
  • 打赏
  • 举报
回复

create table tb
(
[01A] int,[02A] int,[03A] int,[04A] int,[05A] int,[06A] int,[07A] int,[08A] int,
[09A] int,[10A] int,[11A] int,[12A] int,SalesRepCode varchar(10),Name varchar(10)
)
insert into tb
select 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,'1027' ,'SSS' union all
select 123 ,2 ,35 ,5 ,6 ,7 ,8 ,3 ,0 ,0 ,0 ,0 ,'1001' ,'DDD' union all
select 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,'1001' ,'QQQ' union all
select 122 ,0 ,35 ,5 ,6 ,7 ,8 ,3 ,0 ,0 ,0 ,0 ,'1008' ,'BBB'
go

select *
from tb
where [01a]<> 0 or [02a]<> 0 or [03a]<> 0 or [04a]<> 0 or [05a]<> 0 or [06a]<> 0 or [07a]<> 0 or [08a]<> 0 or
[09a]<> 0 or [10a]<> 0 or [11a]<> 0 or [12a]<>0 or SalesRepCode = '1001'

drop table tb

/****************

01A 02A 03A 04A 05A 06A 07A 08A 09A 10A 11A 12A SalesRepCode Name
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------ ----------
123 2 35 5 6 7 8 3 0 0 0 0 1001 DDD
0 0 0 0 0 0 0 0 0 0 0 0 1001 QQQ
122 0 35 5 6 7 8 3 0 0 0 0 1008 BBB

(3 行受影响)


有问题么?
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 acherat 的回复:]
那就用or啊!楼主你还是把过滤不掉的数据拿出来晒晒。
[/Quote]
就是第一条数据,需要保留的是后面3条数据
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 acherat 的回复:]
5楼的测试可以过滤啊!楼主过滤不了的数据是怎样的。
[/Quote]
我的意思是要过滤掉01A~12A全部为0且SalesRepCode不等于1001的数据,如果用and,
01A 02A 03A 04A 05A 06A 07A 08A 09A 10A 11A 12A SalesRepCode Name
0 0 0 0 0 0 0 0 0 0 0 0 1027 SSS
123 2 35 5 6 7 8 3 0 0 0 0 1001 DDD
0 0 0 0 0 0 0 0 0 0 0 0 1001 QQQ
122 0 35 5 6 7 8 3 0 0 0 0 1008 BBB
红色部分都过滤了,但是1008那条数据是需要保留的
如果用Or,压根就没有效果
AcHerat 2011-08-09
  • 打赏
  • 举报
回复
那就用or啊!楼主你还是把过滤不掉的数据拿出来晒晒。
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acherat 的回复:]
SQL code

create table tb(a int,b int,c varchar(10))
insert into tb
select 0,0,'1027' union all
select -1,1,'1011' union all
select 1,0,'1011' union all
select 0,1,'1011'
go

select *
from ……
[/Quote]

用AND的话最后表中最后一条数据就过滤掉了,因为SalesRepCode = 1008
AcHerat 2011-08-09
  • 打赏
  • 举报
回复
5楼的测试可以过滤啊!楼主过滤不了的数据是怎样的。
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ssp2009 的回复:]
SQL code
select * from tb where 01A+012A+..+12A>0 or SalseRepCode=1001
[/Quote]

还是失败啊,过滤不了
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jinfengyiye 的回复:]
楼主是不是没有删除。有了这个也可以删除不要的了。
[/Quote]
删除?不明白,我只是要过滤一部分数据
caomeng2010 2011-08-09
  • 打赏
  • 举报
回复
积分,积分
gw6328 2011-08-09
  • 打赏
  • 举报
回复
楼主是不是没有删除。有了这个也可以删除不要的了。
AcHerat 2011-08-09
  • 打赏
  • 举报
回复

create table tb(a int,b int,c varchar(10))
insert into tb
select 0,0,'1027' union all
select -1,1,'1011' union all
select 1,0,'1011' union all
select 0,1,'1011'
go

select *
from tb
where a <> 0 or b <> 0 or c = '1011'

drop table tb

/************

a b c
----------- ----------- ----------
-1 1 1011
1 0 1011
0 1 1011

(3 行受影响)


这样一个表,保留01A~12A任意一列为非0,或者SalseRepCode = 1001的行。

如果是或者最后一个用or,是且的话用and。
svcce 2011-08-09
  • 打赏
  • 举报
回复
up、!
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
create table tb
(
[01A] int,[02A] int,[03A] int,[04A] int,[05A] int,[06A] int,[07A] int,[08A] int,
[09A] int,[10A] int,[11A] int,[12A] int,SalesRepCode varchar(10),Name varchar(10)
)
insert into tb
select 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,'1027' ,'SSS' union all
select 123 ,2 ,35 ,5 ,6 ,7 ,8 ,3 ,0 ,0 ,0 ,0 ,'1001' ,'DDD' union all
select 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,'1001' ,'QQQ' union all
select 122 ,0 ,35 ,5 ,6 ,7 ,8 ,3 ,0 ,0 ,0 ,0 ,'1008' ,'BBB'
go

select *
from tb
where [01a]<> 0 or [02a]<> 0 or [03a]<> 0 or [04a]<> 0 or [05a]<> 0 or [06a]<> 0 or [07a]<> 0 or [08a]<> 0 or
[09a]<> 0 or [10a]<> 0 or [11a]<> 0 or [12a]<>0 or SalesRepCode = '1001'

drop table tb


测试一下
sdjackal 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acherat 的回复:]
1、

SQL code

select * from tb where 01A+012A+..+12A <> 0 or SalseRepCode=1001



这个写法存在的问题在于如果同时存在负数和整数相加正好是0,那么这个不能用。

2、

SQL code

select *
from tb
where 01A <> 0 or 02A <> 0 or ..……
[/Quote]

第二个试过了,没用
AcHerat 2011-08-09
  • 打赏
  • 举报
回复
1、

select * from tb where 01A+012A+..+12A <> 0 or SalseRepCode=1001


这个写法存在的问题在于如果同时存在负数和整数相加正好是0,那么这个不能用。

2、

select *
from tb
where 01A <> 0 or 02A <> 0 or ... or SalseRepCode=1001
快溜 2011-08-09
  • 打赏
  • 举报
回复
select * from tb where 01A+012A+..+12A>0 or SalseRepCode=1001

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧