COMPANY_CD LINE_NO DC_CODE 其他
000 1 1 其他11
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 5 1 其他51
000 5 0 其他50上面(COMPANY_CD,LINE_NO,DC_CODE)三个是主键,我想通过SQL语句实现城下面这样表示,LINE_NO根据DC_CODE(1,0)成对增加,不存在情况下,设为空。
COMPANY_CD LINE_NO DC_CODE 其他
000 1 1 其他11
000 1 0 NULL
000 2 1 NULL
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 4 0 NULL
000 5 1 其他51
000 5 0 其他50
000 1 1 其他11
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 5 1 其他51
000 5 0 其他50上面(COMPANY_CD,LINE_NO,DC_CODE)三个是主键,我想通过SQL语句实现城下面这样表示,LINE_NO根据DC_CODE(1,0)成对增加,不存在情况下,设为空。
COMPANY_CD LINE_NO DC_CODE 其他
000 1 1 其他11
000 1 0 NULL
000 2 1 NULL
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 4 0 NULL
000 5 1 其他51
000 5 0 其他50
解决方案 »
- 请教一条计算时间差的sql语句
- 怎么去掉企业管理器备份数据库的备份信息
- 选定行的数据值求和
- 问一个SQL语句怎么写,应该不会很难~~
- 求教:在SQL中的存储过程中实现如下功能
- 将access数据库转换成sql后用sqloledb重新建立连接后提示:Microsoft OLE DB Provider for SQL Server 错误 '80004005' 用户 'sa' 登录失
- 请教各位如何转换这个类型.
- ---我想返回其中的sumqty,怎么做?
- 在存储过程中如何用动态游标?
- 命令行执行BCP 提示处理命令行出错
- ORACLE向SQL Server 迁移的类型转换问题
- 如何显示分组数据,类似PB中的数据报表
insert into tb values('000', 1 ,1 ,'其他11')
insert into tb values('000', 2 ,0 ,'其他20')
insert into tb values('000', 3 ,1 ,'其他31')
insert into tb values('000', 3 ,0 ,'其他30')
insert into tb values('000', 4 ,1 ,'其他41')
insert into tb values('000', 5 ,1 ,'其他51')
insert into tb values('000', 5 ,0 ,'其他50')
goselect m.* , n.其他 from
(
select distinct COMPANY_CD , LINE_NO , 1 DC_CODE from tb
union all
select distinct COMPANY_CD , LINE_NO , 0 DC_CODE from tb
) m
left join tb n
on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE descdrop table tb/*
COMPANY_CD LINE_NO DC_CODE 其他
---------- ----------- ----------- ----------
000 1 1 其他11
000 1 0 NULL
000 2 1 NULL
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 4 0 NULL
000 5 1 其他51
000 5 0 其他50(所影响的行数为 10 行)*/
insert into tb values('000', 1 ,1 ,'其他11')
insert into tb values('000', 2 ,0 ,'其他20')
insert into tb values('000', 3 ,1 ,'其他31')
insert into tb values('000', 3 ,0 ,'其他30')
insert into tb values('000', 4 ,1 ,'其他41')
insert into tb values('000', 5 ,1 ,'其他51')
insert into tb values('000', 5 ,0 ,'其他50')
go--1
select m.* , n.其他 from
(
select distinct COMPANY_CD , LINE_NO , 1 DC_CODE from tb
union all
select distinct COMPANY_CD , LINE_NO , 0 DC_CODE from tb
) m
left join tb n
on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE desc--2
select m.* , n.其他 from
(
select t1.* , t2.* from
(select distinct COMPANY_CD , LINE_NO from tb) t1,
(select 0 DC_CODE union select 1 DC_CODE ) t2
) m
left join tb n
on m.COMPANY_CD = n.COMPANY_CD and m.LINE_NO = n.LINE_NO and m.DC_CODE = n.DC_CODE
order by m.COMPANY_CD ,m.LINE_NO ,m.DC_CODE descdrop table tb/*
COMPANY_CD LINE_NO DC_CODE 其他
---------- ----------- ----------- ----------
000 1 1 其他11
000 1 0 NULL
000 2 1 NULL
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 4 0 NULL
000 5 1 其他51
000 5 0 其他50(所影响的行数为 10 行)*/
COMPANY_CD LINE_NO DC_CODE 其他
000 1 1 其他11
000 2 0 其他20
000 3 1 其他31
000 3 0 其他30
000 4 1 其他41
000 5 1 其他51
000 5 0 其他50
另一个为辅助表TB2
DC_CODE 其他B
1 NULL
0 NULL
这样就可以了,语句可以:
select
COMPANY_CD
,LINE_NO
,DC_CODE
,其他
from
(
select A.*, B.* from TB1 A full join TB2 B
) T这样就可以了.
-- Author :fredrickhu(小F,向高手学习)
-- Date :2010-04-26 09:55:14
-- Verstion:
-- Microsoft SQL Server 2005 - 9.00.4053.00 (Intel X86)
-- May 26 2009 14:24:20
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([COMPANY_CD] varchar(3),[LINE_NO] int,[DC_CODE] int,[其他] varchar(6))
insert [tb]
select '000',1,1,'其他11' union all
select '000',2,0,'其他20' union all
select '000',3,1,'其他31' union all
select '000',3,0,'其他30' union all
select '000',4,1,'其他41' union all
select '000',5,1,'其他51' union all
select '000',5,0,'其他50'
--------------开始查询--------------------------
select
a.*,b.其他
from
(
select
*
from
(
select distinct COMPANY_CD,LINE_NO from tb
)a
cross join
(
select distinct DC_CODE from tb
)b
)a
left join
tb b
on
a.COMPANY_CD=b.COMPANY_CD and a.LINE_NO=b.LINE_NO and a.DC_CODE=b.DC_CODE
----------------结果----------------------------
/*COMPANY_CD LINE_NO DC_CODE 其他
---------- ----------- ----------- ------
000 1 0 NULL
000 2 0 其他20
000 3 0 其他30
000 4 0 NULL
000 5 0 其他50
000 1 1 其他11
000 2 1 NULL
000 3 1 其他31
000 4 1 其他41
000 5 1 其他51(10 行受影响)
*/
declare @TB1 table(COMPANY_CD char(4), LINE_NO tinyint, DC_CODE tinyint, 其他 char(10))
insert @TB1 select '000', 1, 1, '其他11'
union all select '000', 2, 0, '其他20'
union all select '000', 3, 1, '其他31'
union all select '000', 3, 0, '其他30'
union all select '000', 4, 1, '其他41'
union all select '000', 5, 1, '其他51'
union all select '000', 5, 0, '其他50'declare @TB2 table(DC_CODE1 tinyint, 其他1 char(10))
insert @TB2 select 1, NULL
union all select 0, NULLselect
COMPANY_CD
,LINE_NO
,DC_CODE1 as DC_CODE
,max(case when DC_CODE = DC_CODE1 then 其他 else null end) as 其他
from
(
select
A.*
,B.*
from
@TB1 A
full join
@TB2 B
on
1 = 1
) TT
group by
COMPANY_CD
,LINE_NO
,DC_CODE1
insert @TB1 select '000', 1, 1, '其他11'
union all select '000', 2, 0, '其他20'
union all select '000', 3, 1, '其他31'
union all select '000', 3, 0, '其他30'
union all select '000', 4, 1, '其他41'
union all select '000', 5, 1, '其他51'
union all select '000', 5, 0, '其他50'declare @TB2 table(DC_CODE1 tinyint, 其他1 char(10))
insert @TB2 select 1, NULL
union all select 0, NULLselect
COMPANY_CD
,LINE_NO
,DC_CODE1 as DC_CODE
,max(case when DC_CODE = DC_CODE1 then 其他 else null end) as 其他
from
(
select
A.*
,B.*
from
@TB1 A
cross join
@TB2 B
) TT
group by
COMPANY_CD
,LINE_NO
,DC_CODE1
order by
COMPANY_CD
,LINE_NO
,其他 desc
create table tb(COMPANY_CD varchar(10),LINE_NO int,DC_CODE int,其他 varchar(10))
insert into tb values('000', 1 ,1 ,'其他11')
insert into tb values('000', 2 ,0 ,'其他20')
insert into tb values('000', 3 ,1 ,'其他31')
insert into tb values('000', 3 ,0 ,'其他30')
insert into tb values('000', 4 ,1 ,'其他41')
insert into tb values('000', 5 ,1 ,'其他51')
insert into tb values('000', 5 ,0 ,'其他50')
go
SELECT t.COMPANY_CD,t.DC_CODE,t.LINE_NO,tb.其他
FROM
(
SELECT DISTINCT COMPANY_CD,LINE_NO,'0' AS DC_CODE FROM tb
UNION ALL
SELECT DISTINCT COMPANY_CD,LINE_NO,'1' AS DC_CODE FROM tb
) t
LEFT JOIN tb ON tb.LINE_NO=t.LINE_NO AND tb.DC_CODE=t.DC_CODE AND tb.COMPANY_CD=t.COMPANY_CD
ORDER BY LINE_NO