① sql 橫表變豎表 動態語句怎麼寫
1、首先 日期沒有出現在Group里
2、其次,組成動態的【,isnull(sum(...))】沒有去掉最前面的那個逗號
3、感覺這個語句肯定不會執行成功,最好你把表結構給出,並且給出示例結果來。
② SQL 豎列 轉換橫列的問題
使用CASE來處理。
select 編號, sum( 第一季度第一次施肥量) 第一季度第一次施肥量, sum( 第一季度第二次施肥量) 第一季度第二次施肥量, sum( 第二季度第一次施肥量) 第二季度第一次施肥量
from
(
select 編號
case when 季度=1 and 施肥次數=1 then 施肥量 else null end 第一季度第一次施肥量,
case when 季度=1 and 施肥次數=2 then 施肥量 else null end 第一季度第二次施肥量,
case when 季度=2 and 施肥次數=1 then 施肥量 else null end 第二季度第一次施肥量
from 表
) a
group by a.編號
③ 關於sql server 豎列變橫列顯示問題。
使用case when 和group by 的語法。
或是使用pivot(sql 2005及後續版本支持)
④ SQL數據橫列變豎列
以下方法適用於任意多的科目:
--先建立函數,功能是根據給出的姓名,到表中去查找所選科目及成績並橫向列示出來.
CREATE FUNCTION getcoldata
(@XM VARCHAR(18))
RETURNS varchar(1000)
AS
BEGIN
DECLARE @deli VARCHAR(2)
set @deli=' '
declare @f1 varchar(100),@F2 DECIMAL(12,1),@result varchar(1000),@sn0 int
set @result=''
declare ddcursor cursor for select 選修科目,成績 from 表名 where 姓名=@XM order by 選修科目
open ddcursor
fetch next from ddcursor into @f1,@F2
while @@fetch_status!=-1
begin
set @result=@result+@deli+isnull(@f1,'')+':'+ISNULL(CONVERT(VARCHAR,@F2),'')
fetch next from ddcursor into @f1,@F2
end
close ddcursor
deallocate ddcursor
return (@result)
end
GO
--使用方法:
select 姓名,科目及成績=dbo.getcoldata(姓名) from (SELECT DISTINCT 姓名 from 表名) a
結果是這樣的
姓名 科目與成績
張三 計算機:75 高等數學:80 物理:77
李四 高等數學:55 微積分:87
王五 語文:78
=============
我這么看您的問題:
1.查詢是用來輸出的,不是用來統計的:您的這種結果即使用分開欄位也是很不容易統計的,要想統計還是原表比較方便.
就是說:這種查詢結果更方便輸出\查看,原表更方便於作統計.
所以,我勸您,比較科學的作法是保留原表,可以方便的作出包括本查詢在內的各種查詢.而您如果只保留查詢後的表,即使用欄位是分開的,那麼將很難再作其它統計和查詢.因為數據太不規范.
2.可以輸出各門分開的EXCEL表:如果您想輸出到EXCEL表,您要以把函數中的分隔符改成逗點或製表符(CHAR(9)),直接存成CSV或XLS文檔就成了.
3.完全按照您的結果也能輸出.但今天我沒空了,給你個提示:
先看看我以前的回答中,有一些是關於加序號的,加上序號後就好說了.
===========
加到200分,我就開始為您作分開欄位的查詢.(辦法我知道,但是很麻煩啊)
===============================================
與您的要求完全相同的查詢:
為了清楚,先建立一個查詢,給每人的科目加序號,如果不理解,執行一下SELECT * FROM MYVIEWNAME就知道了:
=====================
視圖改一下:
create view myviewname
as
select 姓名,科目,成績,序號=(select count(1) from tablename a where a.姓名=b.姓名 and a.科目>=b.科目) from
(select * from tablename where 狀態='有效') --以子查詢替換了TABLENAME,夠直觀吧?
b --視圖加上了序號欄位
go
然後,這就是您要的查詢,根據每人所選科目的最大數,可以無限向後延伸,加入科目6,科目7等:
select a.姓名,
科目1=isnull(t1.科目,''),
成績1=isnull(t1.成績,''),
科目2=isnull(t2.科目,''),
成績2=isnull(t2.成績,''),
科目3=isnull(t3.科目,''),
成績3=isnull(t3.成績,''),
科目4=isnull(t4.科目,''),
成績4=isnull(t4.成績,''),
科目5=isnull(t5.科目,''),
成績5=isnull(t5.成績,'')
from (SELECT DISTINCT 姓名 from tablename) a
left join myviewname t1 on t1.姓名=a.姓名 and t1.序號=1
left join myviewname t2 on t2.姓名=a.姓名 and t2.序號=2
left join myviewname t3 on t3.姓名=a.姓名 and t3.序號=3
left join myviewname t4 on t4.姓名=a.姓名 and t4.序號=4
left join myviewname t5 on t5.姓名=a.姓名 and t5.序號=5
好了,加到200分再選擇正確答案!
⑤ Sql語句查詢問題,如何將橫排的數據變為豎排
select*from
(
select PartNO , Year,Month='Jan' , Result = Jan from tb1
unionall
select PartNO , Year,Month ='Feb' , Result = Feb from tb1
unionall
select PartNO , Year,Month='Mar' , Result = Mar from tb1
) t
orderby PartNO, case Month when'Jan' then1when'Feb'then 2 when'Mar' then3 end
⑥ SQL裡面如何將豎著的列橫著顯示
一般這樣的情況
如果是我做的話
就預先建立一個表
設置time1
time1
time3……
然後
分別逐次以
no
和日期為
time
分組
;行標題
time
為列標題
和
值(求和)……對先前建立的表進行追加……
SQL
我不太熟悉
在access
中
完全可以做的……
還有
如果
你能夠
把你的時間
劃分成不同的時間段
而對應到固定的時間段中的話,完全
直接可以使用
一個交叉查詢就可以了……
但願
這個提示
對你有所幫助……
⑦ sql里邊怎麼豎列變橫列,
這個最好在一個存儲過程中完成。因為每個「分組值」的多少不同。比如PF66152210L有兩個,有些就有三個,誰知道最多有多少個,以前寫過一個,是用過程完成的。
加特徵碼
用row_number() over 並將這個欄位命名為rows
按照f1分組,然後,這樣能在後面加上1,2,3,.....,不用排序,分組就行
利用case when
在剛才那個查詢結果的外麵包一層,利用(case when rows=1 then f2 end)h2,(case when rows=2 then f2 end)h3,....... group by f1
你試試吧,應該可以。
如果,f2在一行里邊,中間用,隔開也可以
那麼就用 wmsys.wm_concat就行了。(不過我說的是oracle庫啊)
⑧ SQL 橫排變豎排的問題
給例子遠比你貼代碼快,
SELECT name,
SUM(CASE subject WHEN '語文' THEN Result ELSE 0 END),
SUM(CASE subject WHEN '數學' THEN Result ELSE 0 END),
SUM(CASE subject WHEN '物理' THEN Result ELSE 0 END)
FROM tb
GROUP BY Name
⑨ 一張收款表,SQL數據橫列變豎列
可以先
select 一下 插入臨時表 做個匯總
例如:
select sum(要匯總的欄位) as 欄位名 into #臨時表 from 表名
然後再 按 行轉列的方法 轉換
http://blog.sina.com.cn/s/blog_4cca663f0100abfv.html
這里有 很詳細的 方法 看看吧
⑩ SQL 怎麼把橫向數據變成豎向數據
隨緣寫法···可能有更精簡的,我這就趕著想趕著寫的 你看看能看懂不,如果覺得對不懂可以聯系我
select
nn.客戶 客戶,
nn.昵稱 昵稱,
nn.補單日期1 補單日期1,
nn.業務員1 業務員1,
nn.補單日期2 補單日期2,
nn.業務員2 業務員2,
nn.補單日期3 補單日期3,
nn.業務員3 業務員3,
nn.補單日期4 補單日期4,
nn.業務員4 業務員4,
nn.業務員1 首選業務員,
nn.業務員2||'-'||nn.業務員3||'-'||nn.業務員4 候選業務員
from (
select tt.a2 客戶,tt.a3 昵稱,wm_concat (case when tt.top=0 then tt.a0 else '' end) 補單日期1,
wm_concat (case when tt.top=0 then tt.a4 else ''end) 業務員1,
wm_concat (case when tt.top=1 then tt.a0 else ''end) 補單日期2,
wm_concat (case when tt.top=1 then tt.a4 else ''end) 業務員2,
wm_concat (case when tt.top=2 then tt.a0 else ''end) 補單日期3,
wm_concat (case when tt.top=2 then tt.a4 else ''end) 業務員3,
wm_concat (case when tt.top=3 then tt.a0 else''end) 補單日期4,
wm_concat (case when tt.top=3 then tt.a4 else ''end) 業務員4
from
(
select zz.* from
(
select a.*,(select count(1) from a a1 where a1.a2=a.a2 and a.a0<a1.a0) top from a ORDER BY A2,A0 DESC
) zz
where
zz.top<4
) tt group by tt.a2,tt.a3
) nn