‘壹’ sql如何使用select动态列 from 进行查询
这就是传说中的交叉表
/*
普通行列转换
假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/
-------------------------------------------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/
create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go
--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
/*
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74
*/
‘贰’ sql中查询的时候根据一列动态生成另一列
生成规则是什么呢,在下面的SQL语句中加上你的生成规则Select A,B,B*5 as C(你的规则) from yourTable
‘叁’ 请问sql中怎么实现字段的动态查询
用动态sql即可实现。
如student表中有如下内容:
‘肆’ 如何SQL动态添加查询字段
如student表中有如下内容:
现在查询条件不定,但只能是一个字段,如:可能会查sex为男的人,可能会查name为张三的人。可以这样写一个简单的存储过程。
1
2
3
4
5
6
7
declare @<a href="https://www..com/s?wd=col&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EPHm1njcknj6s" target="_blank" class="-highlight">col</a> varchar(20)
declare @sql varchar(2000)
declare @str varchar(20)
set @<a href="https://www..com/s?wd=col&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EPHm1njcknj6s" target="_blank" class="-highlight">col</a>='sex'
set @str='男'
‘伍’ 如何根据数据库查询结果,确定动态显示的列
动态sql组织好以后,也不知道到底最后是哪些列被查询出来了,那样的话,在模板设计中怎么设计。未使用动态sql的时候,我是这样想的。建立两个报表数据集,ds1,ds2(分别是select * from 表1;from 表2),然后标题中ABC列后面,直接用ds2.S(RID) 从左到右扩展。这样标题就动态产生了。但是不知道动态标题下面对应的数据该用什么公式写。按理可以用ds1.G(此行标题所在单元格的值)或者ds2.S(此行标题所在单元格的值).此行标题所在单元格的值,就是表1中该列的名称。但是不行。
‘陆’ SQL语句如何实现动态列
你的这些值应该有个范围控制吧,比如:人工费(100-200) 材料费(1000-2000)。。。
你可以通过这些值的大小来判断是什么费用,整几个列,人工的放在这,材料的放在那,。。。
总之要有个判断的依据,照你这样,这也不确定,那也不确定,何苦来哉?
‘柒’ 如何解决sql语句中的动态多列查询问题
select sum(case when con1||con2='11' then count else 0 end) 三星笔记本,
sum(case when con1||con2='12' then count else 0 end) 三星台式机,
sum(case when con1||con2='22' then count else 0 end) 苹果笔记本,
sum(case when con1||con2='22' then count else 0 end) 苹果台式机
from table_name
另外用decode一样可以替代case when,效率一样
‘捌’ Sql查询出来的时候怎么动态加入一列标识列
在SQL2005以上的版本,里面有一个专门你所要增加的列,试试哈
select * from (select row_number()over(order by 排序的字段)
as 自动序列,* from 表名) aa
where 自动序列
‘玖’ 如何用oracle动态查询一张表里面的某些列
在PLSQL中使用EXECUTE IMMEDIATE语句处理动态SQL语句。
语法如下:
EXECUTE IMMEDIATE dynamic_string
[INTO {define_variable[, define_variable]... | record}]
[USING [IN | OUT | IN OUT] bind_argument
[, [IN | OUT | IN OUT] bind_argument]...]
[{RETURNING | RETURN} INTO bind_argument[, bind_argument]...];
dynamic_string是代表一条SQL语句或一个PL/SQL块的字符串表达式,
define_variable是用于存放被选出的字段值的变量,
record是用户定义或%ROWTYPE类型的记录,用来存放被选出的行记录。
输入bind_argument参数是一个表达式,它的值将被传入(IN模式)或传出(OUT模式)或先传入再传出(IN OUT模式)到动态SQL语句或是PL/SQL块中。一个输出bind_argument参数就是一个能保存动态SQL返回值的变量。
除了多行查询外,动态字符串可以包含任何SQL语句(不含终结符)或PL/SQL块(含终结符)。
字符串中可以包括用于参数绑定的占位符。
但是,不可以使用绑定参数为动态SQL传递模式对象。
在用于单行查询时,INTO子句要指明用于存放检索值的变量或记录。
对于查询检索出来的每一个值,INTO子句中都必须有一个与之对应的、类型兼容的变量或字段。
在用于DML操作时,RETURNING INTO子句要指明用于存放返回值的变量或记录。
对于DML语句返回的每一个值,INTO子句中都必须有一个与之对应的、类型兼容的变量或字段。
我们可以把所有的绑定参数放到USING子句中。默认的参数模式是IN。
对于含有RETURNING子句的DML语句来说,我们可以把OUT参数放到RETURNING INTO之后,并且不用指定它们的参数模式,因为默认就是OUT。
如果我们既使用了USING又使用RETURNING INTO,那么,USING子句中就只能包含IN模式的参数了。
运行时,动态字符串中的绑定参数会替换相对应的占位符。所以,每个占位符必须与USING子句和/或RETURNING INTO子句中的一个绑定参数对应。我们可以使用数字、字符和字符串作为绑定参数,但不能使用布尔类型(TRUE,FALSE和NULL)。要把空值传递给动态字符串,我们就必须使用工作区。
动态SQL支持所有的SQL类型。所以,定义变量和绑定变量都可以是集合、LOB,对象类型实例和引用。
作为一项规则,动态SQL是不支持PL/SQL特有的类型的。这样,它就不能使用布尔型或索引表。
我们可以重复为绑定变量指定新值执行动态SQL语句。但是,每次都会消耗很多资源,因为EXECUTE IMMEDIATE在每次执行之前都需要对动态字符串进行预处理。
‘拾’ SQL查询动态列的方法
首先,这张表本身就很不合理,如果不是硬要用这种结构,推荐您使用一列存储数据,我有点明白您可能是要最后通过select生成一张月报表,不知我的猜想对吗?(好像还是没搞清楚)
就事论事吧
create proc xxx @day int
as
if @day=1 select * from 表 where D1=@day
if @day=2 select * from 表 where D2=@day
if @day=3 select * from 表 where D3=@day
if @day=4 select * from 表 where D4=@day
后面就不写了,共要31行,恐怕也是最好想出的办法了