『壹』 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行,恐怕也是最好想出的辦法了