表结构:
类别 品号 厂商代号,厂商名称, 单价, 数量 是否主厂商
采购 S091000349C00PBZ 61004R 东驰 0.75384000 0.00000000 主厂商
采购 S091000430D00PBZ 61202R 泰铭 0.20000000 0.00000000
采购 S091000430D00PBZ 61009R 抉胜 1.80000000 0.00000000 主厂商
采购 S091000463A00PBZ 61003R 洋发 0.42040000 0.00000000 主厂商
托工 S092000360B00P8K 67505R 金星 0.10000000 0.00000000
采购 N314000007B00P43 66601R 良晋 0.20960000 0.00000000 主厂商
想增加标识字段,条件:当同一采购类别,同一品号,同一数量,非主厂商单价高于主厂商单价时,标识为'高'
类别 品号 厂商代号,厂商名称, 单价, 数量 是否主厂商
采购 S091000349C00PBZ 61004R 东驰 0.75384000 0.00000000 主厂商
采购 S091000430D00PBZ 61202R 泰铭 0.20000000 0.00000000
采购 S091000430D00PBZ 61009R 抉胜 1.80000000 0.00000000 主厂商
采购 S091000463A00PBZ 61003R 洋发 0.42040000 0.00000000 主厂商
托工 S092000360B00P8K 67505R 金星 0.10000000 0.00000000
采购 N314000007B00P43 66601R 良晋 0.20960000 0.00000000 主厂商
想增加标识字段,条件:当同一采购类别,同一品号,同一数量,非主厂商单价高于主厂商单价时,标识为'高'
where 条件你已经描述的很清楚
alter table test
add [标志] varchar(2)update test
set [标志]='高'
where exists (select 1 from test a where a.类别=test.类别 and a.品号=test.品号 and a.数量=test.数量 and a.单价>test.单价 and a.是否主厂商='主厂商')
and test.是否主厂商=null
[code=sql]
IF(OBJECT_ID('TA','U') IS NOT NULL) DROP TABLE TA
CREATE TABLE TA(类别 VARCHAR(10), 品号 VARCHAR(20),
厂商代号 VARCHAR(10),厂商名称 VARCHAR(10),
单价 FLOAT,数量 FLOAT,是否主厂商 VARCHAR(10))
INSERT INTO TA
SELECT '采购', 'S091000349C00PBZ','61004R','东驰',0.75384000, 0.00000000,'主厂商' UNION ALL
SELECT '采购', 'S091000430D00PBZ','61202R','泰铭',0.20000000, 0.00000000,' ' UNION ALL
SELECT '采购', 'S091000430D00PBZ','61009R','抉胜',1.80000000, 0.00000000,'主厂商' UNION ALL
SELECT '采购', 'S091000463A00PBZ','61003R','洋发',0.42040000, 0.00000000,'主厂商' UNION ALL
SELECT '托工', 'S092000360B00P8K','67505R','金星',0.10000000, 0.00000000,' ' UNION ALL
SELECT '采购', 'N314000007B00P43','66601R','良晋',0.20960000, 0.00000000,'主厂商'
SELECT * FROM TA tALTER TABLE TA ADD Flag VARCHAR(10)
UPDATE TA
SET Flag='高'
FROM TA AS T1,(SELECT * FROM TA WHERE TA.是否主厂商='') AS T2
WHERE T1.类别=T2.类别 AND T1.品号=T2.品号
AND T1.数量=T2.数量 AND T2.单价>T1.单价 [/code]
采购 L011000765A00P0@ 61018R 泽城 7.58080000 0.00000000 主厂商
采购 L011000765A00P0@ 60000 新厂商 6.00000000 0.00000000
此时应该得到结果:
采购 L011000765A00P0@ 61018R 泽城 7.58080000 0.00000000 主厂商 高
采购 L011000765A00P0@ 60000 新厂商 6.00000000 0.00000000
你开始说的是非主厂商单价高于主厂单价时,标识为'高',那样用4楼的当然不没有结果啦!
把最后的AND T1.数量=T2.数量 AND T2.单价>T1.单价 改成<号
---------- -------------------- ---------- ---------- ---------------------- ---------------------- ---------- ----------
采? S091000349C00PBZ 61004R ?? 0.75384 0 主厂商 NULL
采? S091000430D00PBZ 61202R 泰? 0.2 0 NULL
采? S091000430D00PBZ 61009R 抉胜 1. 0 主厂商 高
采? S091000463A00PBZ 61003R 洋? 0.4204 0 主厂商 NULL
托工 S092000360B00P8K 67505R 金星 0.1 0 NULL
采? N314000007B00P43 66601R 良? 0.2096 0 主厂商 NULL(6 row(s) affected)你要的不是这种效果吗?我是运行4楼的,是你的需求啊
----------------------------------------------------------------
-- Author :TravyLee(物是人非事事休,欲语泪先流!)
-- Date :2012-12-04 10:01:41
-- Version:-- Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) -- Feb 10 2012 19:13:17 -- Copyright (c) Microsoft Corporation-- Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null
drop table [test]
go
create table [test]
(
[类别] varchar(4),
[品号] varchar(16),
[厂商代号] varchar(6),
[厂商名称] varchar(4),
[单价] numeric(9,8),
[数量] numeric(9,8),
[是否主厂商] varchar(6)
)
insert [test]
select '采购','S091000349C00PBZ','61004R','东驰',0.75384000,0.00000000,'主厂商' union all
select '采购','S091000349C00PBZ','61004R','东驰',0.85384000,0.00000000,null union all
select '采购','S091000430D00PBZ','61202R','泰铭',2.20000000,0.00000000,null union all
select '采购','S091000430D00PBZ','61202R','泰铭',0.20000000,0.00000000,null union all
select '采购','S091000430D00PBZ','61009R','抉胜',1.80000000,0.00000000,'主厂商' union all
select '采购','S091000463A00PBZ','61003R','洋发',0.42040000,0.00000000,'主厂商' union all
select '托工','S092000360B00P8K','67505R','金星',0.10000000,0.00000000,null union all
select '采购','N314000007B00P43','66601R','良晋',0.20960000,0.00000000,'主厂商' union all
select '采购','N314000007B00P43','66601R','良晋',0.19960000,0.00000000,null
go
alter table test
add [标志] varchar(10)
goupdate test
set [标志]='高'
where exists(select 1 from test b
where test.类别=b.类别 and test.品号=b.品号 and test.数量=b.数量 and test.单价>b.单价 and b.是否主厂商='主厂商')select * from test /*
类别 品号 厂商代号 厂商名称 单价 数量 是否主厂商 标志
---- ---------------- ------ ---- --------------------------------------- --------------------------------------- ------ ----------
采购 S091000349C00PBZ 61004R 东驰 0.75384000 0.00000000 主厂商 NULL
采购 S091000349C00PBZ 61004R 东驰 0.85384000 0.00000000 NULL 高
采购 S091000430D00PBZ 61202R 泰铭 2.20000000 0.00000000 NULL 高
采购 S091000430D00PBZ 61202R 泰铭 0.20000000 0.00000000 NULL NULL
采购 S091000430D00PBZ 61009R 抉胜 1.80000000 0.00000000 主厂商 NULL
采购 S091000463A00PBZ 61003R 洋发 0.42040000 0.00000000 主厂商 NULL
托工 S092000360B00P8K 67505R 金星 0.10000000 0.00000000 NULL NULL
采购 N314000007B00P43 66601R 良晋 0.20960000 0.00000000 主厂商 NULL
采购 N314000007B00P43 66601R 良晋 0.19960000 0.00000000 NULL NULL(9 行受影响)
*/
UPDATE TASET Flag='高'FROM TA AS T1,(SELECT * FROM TA WHERE TA.是否主厂商='') AS T2
WHERE T1.类别=T2.类别 AND T1.品号=T2.品号 AND T1.厂商代号=T2. 厂商代号
AND T1.数量=T2.数量 AND T2.单价<T1.单价
类别 品号 厂商代号 厂商名称 单价 数量 是否主厂商 Flag
采购 L011000765A00 61018 泽城 7.580800 100 主厂商
采购 L011000765A00 61018 泽城 7.000000 200 主厂商
采购 L011000765A00 61018 泽城 6.000000 300 主厂商
采购 L011000765A00 60000 卡而 7.000000 100
采购 L011000765A00 60001 大通 8.000000 200
采购 L011000765A00 60003 顺利 5.000000 300
托工 L011000765A00 61018 泽城 7.580800 100 主厂商
托工 L011000765A00 61018 泽城 7.000000 200 主厂商
托工 L011000765A00 61018 泽城 6.000800 300 主厂商
托工 L011000765A00 60000 卡而 8.000000 100
托工 L011000765A00 60001 大通 7.500000 200
托工 L011000765A00 60003 顺利 5.800000 300
需要得到结果:
类别 品号 厂商代号 厂商名称 单价 数量 是否主厂商 Flag
采购 L011000765A00 61018 泽城 7.580800 100 主厂商 高
采购 L011000765A00 61018 泽城 7.000000 200 主厂商
采购 L011000765A00 61018 泽城 6.000000 300 主厂商 高
采购 L011000765A00 60000 卡而 7.000000 100
采购 L011000765A00 60001 大通 8.000000 200
采购 L011000765A00 60003 顺利 5.000000 300
托工 L011000765A00 61018 泽城 7.580800 100 主厂商
托工 L011000765A00 61018 泽城 7.000000 200 主厂商
托工 L011000765A00 61018 泽城 6.000800 300 主厂商 高
托工 L011000765A00 60000 卡而 8.000000 100
托工 L011000765A00 60001 大通 7.500000 200
托工 L011000765A00 60003 顺利 5.800000 300
另外数据大概有30W,循环也可以.但不知道大概需要多长时间.硬件4X2.0(6核). Memory 64GB
----------------------------------------------------------------
-- Author :TravyLee(物是人非事事休,欲语泪先流!)
-- Date :2012-12-04 11:43:56
-- Version:-- Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) -- Feb 10 2012 19:13:17 -- Copyright (c) Microsoft Corporation-- Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]
(
[类别] varchar(4),
[品号] varchar(13),
[厂商代号] int,
[厂商名称] varchar(4),
[单价] numeric(7,6),
[数量] int,
[是否主厂商] varchar(6),
[Flag] varchar(10)
)
insert [test]
select '采购','L011000765A00',61018,'泽城',7.580800,100,'主厂商',null union all
select '采购','L011000765A00',61018,'泽城',7.000000,200,'主厂商',null union all
select '采购','L011000765A00',61018,'泽城',6.000000,300,'主厂商',null union all
select '采购','L011000765A00',60000,'卡而',7.000000,100,null,null union all
select '采购','L011000765A00',60001,'大通',8.000000,200,null,null union all
select '采购','L011000765A00',60003,'顺利',5.000000,300,null,null union all
select '托工','L011000765A00',61018,'泽城',7.580800,100,'主厂商',null union all
select '托工','L011000765A00',61018,'泽城',7.000000,200,'主厂商',null union all
select '托工','L011000765A00',61018,'泽城',6.000800,300,'主厂商',null union all
select '托工','L011000765A00',60000,'卡而',8.000000,100,null,null union all
select '托工','L011000765A00',60001,'大通',7.500000,200,null,null union all
select '托工','L011000765A00',60003,'顺利',5.800000,300,null,null
goupdate test
set [Flag]='高'
where exists(select 1 from test a where a.类别=test.类别 and a.品号=test.品号
and a.数量=test.数量 and a.单价<test.单价 and a.是否主厂商='主厂商')
--这是我按照你描述的思路写出来的结果
select * from test /*
类别 品号 厂商代号 厂商名称 单价 数量 是否主厂商 Flag
---- ------------- ----------- ---- --------------------------------------- ----------- ------ ----------
采购 L011000765A00 61018 泽城 7.580800 100 主厂商 NULL
采购 L011000765A00 61018 泽城 7.000000 200 主厂商 NULL
采购 L011000765A00 61018 泽城 6.000000 300 主厂商 NULL
采购 L011000765A00 60000 卡而 7.000000 100 NULL NULL
采购 L011000765A00 60001 大通 8.000000 200 NULL 高
采购 L011000765A00 60003 顺利 5.000000 300 NULL NULL
托工 L011000765A00 61018 泽城 7.580800 100 主厂商 NULL
托工 L011000765A00 61018 泽城 7.000000 200 主厂商 NULL
托工 L011000765A00 61018 泽城 6.000800 300 主厂商 NULL
托工 L011000765A00 60000 卡而 8.000000 100 NULL 高
托工 L011000765A00 60001 大通 7.500000 200 NULL 高
托工 L011000765A00 60003 顺利 5.800000 300 NULL NULL(12 行受影响)
*/
----------------------------------------------------------------
-- Author :TravyLee(物是人非事事休,欲语泪先流!)
-- Date :2012-12-04 11:43:56
-- Version:-- Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) -- Feb 10 2012 19:13:17 -- Copyright (c) Microsoft Corporation-- Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]
(
[类别] varchar(4),
[品号] varchar(13),
[厂商代号] int,
[厂商名称] varchar(4),
[单价] numeric(7,6),
[数量] int,
[是否主厂商] varchar(6),
[Flag] varchar(10)
)
insert [test]
select '采购','L011000765A00',61018,'泽城',7.580800,100,'主厂商',null union all
select '采购','L011000765A00',61018,'泽城',7.000000,200,'主厂商',null union all
select '采购','L011000765A00',61018,'泽城',6.000000,300,'主厂商',null union all
select '采购','L011000765A00',60000,'卡而',7.000000,100,null,null union all
select '采购','L011000765A00',60001,'大通',8.000000,200,null,null union all
select '采购','L011000765A00',60003,'顺利',5.000000,300,null,null union all
select '托工','L011000765A00',61018,'泽城',7.580800,100,'主厂商',null union all
select '托工','L011000765A00',61018,'泽城',7.000000,200,'主厂商',null union all
select '托工','L011000765A00',61018,'泽城',6.000800,300,'主厂商',null union all
select '托工','L011000765A00',60000,'卡而',8.000000,100,null,null union all
select '托工','L011000765A00',60001,'大通',7.500000,200,null,null union all
select '托工','L011000765A00',60003,'顺利',5.800000,300,null,null
goupdate test
set [Flag]='高'
where exists(select 1 from test a where a.类别=test.类别 and a.品号=test.品号
and a.数量=test.数量 and a.单价<test.单价 and a.是否主厂商 is null)select * from test /*
类别 品号 厂商代号 厂商名称 单价 数量 是否主厂商 Flag
---- ------------- ----------- ---- --------------------------------------- ----------- ------ ----------
采购 L011000765A00 61018 泽城 7.580800 100 主厂商 高
采购 L011000765A00 61018 泽城 7.000000 200 主厂商 NULL
采购 L011000765A00 61018 泽城 6.000000 300 主厂商 高
采购 L011000765A00 60000 卡而 7.000000 100 NULL NULL
采购 L011000765A00 60001 大通 8.000000 200 NULL NULL
采购 L011000765A00 60003 顺利 5.000000 300 NULL NULL
托工 L011000765A00 61018 泽城 7.580800 100 主厂商 NULL
托工 L011000765A00 61018 泽城 7.000000 200 主厂商 NULL
托工 L011000765A00 61018 泽城 6.000800 300 主厂商 高
托工 L011000765A00 60000 卡而 8.000000 100 NULL NULL
托工 L011000765A00 60001 大通 7.500000 200 NULL NULL
托工 L011000765A00 60003 顺利 5.800000 300 NULL NULL(12 行受影响)
*/