在資料庫板塊看到乙個問題:
col1
col2
col3
a 100
2009-1-5
a 80
2009-1-8
b 300
2009-1-9
b 60
2009-1-7
c 100
2009-1-9
c 150
2009-1-10
根據日期區間查詢(例如查詢 2009/1/4到2009/1/10)得到以下結果
col1
2009-1-4
2009-1-5
2009-1-6
2009-1-7
2009-1-8
2009-1-9
2009-1-10
a 0
100
0 0
80 0
0 b
0 0
0 60
0 300
0 c
0 0
0 0
0 100
150
這是乙個資料庫交叉報表的問題,經常碰到的是固定的列,但是這個問題中,日期是不固定的,查詢間隔可多可少,具體實現方法如下。
create table t
(col1 varchar(10),
col2 int,
col3 datetime
)insert into t (col1,col2,col3)values('a',100,'2009-1-5')
insert into t (col1,col2,col3)values('a',80,'2009-1-8')
insert into t (col1,col2,col3)values('b',300,'2009-1-9')
insert into t (col1,col2,col3)values('b',60,'2009-1-7')
insert into t (col1,col2,col3)values('c',100,'2009-1-9')
insert into t (col1,col2,col3)values('c',150,'2009-1-10')
declare @begindate datetime --查詢開始時間
declare @enddate datetime --查詢結束時間
declare @sql varchar(8000)
set @begindate = cast('2009-1-4' as datetime)
set @enddate = cast('2009-1-10' as datetime)
set @sql = 'select col1,'
while (datediff(d,@begindate,@enddate)>0) --迴圈新增日期列
begin
set @sql = @sql + 'sum(case col3 when '''+cast(@begindate as varchar)+''' then col2 else 0 end) as '''+convert(varchar(10),@begindate,120)+''','
set @begindate = dateadd(d,1,@begindate)
end
set @sql = @sql + 'sum(case col3 when '''+cast(@begindate as varchar)+''' then col2 else 0 end) as '''+convert(varchar(10),@begindate,120)+''' '
set @sql = @sql + 'from t group by col1'
exec(@sql)
執行結果
------------------------
col1 2009-01-04 2009-01-05 2009-01-06 2009-01-07 2009-01-08 2009-01-09 2009-01-10
1 a 0 100 0 0 80 0 0
2 b 0 0 0 60 0 300 0
3 c 0 0 0 0 0 100 150
報表設計 交叉報表 多層交叉
一 新建資料來源 二 操作步驟 在c1單元格中填寫 to 1,3 設定為橫向擴充套件 在c2單元格中填寫 to 21,22 設定為橫向擴充套件 在c3單元格中填寫 to 13,15 設定為橫向擴充套件 在a4單元格中填寫 to 11,13 設定為縱向擴充套件 在b4單元格中填寫 to 31,33 設...
Xtrareport 交叉報表
什麼是交叉報表呢?官方回答 交叉表報表是以交叉表形式呈現資訊的報表。交叉表 或透視表 類似於簡單的普通資料繫結 但是改為在單個 中呈現多維的分層級的資訊,並含有每行和每列的自動排序 計數 合計和累計。依照慣例,我們先來看看我們最後實現的效果,如圖 案例場景 某公司可能有產品1 12,分別屬於產品類別...
交叉資料包表
有時候需要旋轉結果以便在水平方向顯示列,而在垂直方向顯示行。這就是所謂的建立 pivottable 建立交叉資料包表或旋轉資料。假定有乙個表pivot,其中每季度佔一行。對pivot的 select 操作在垂直方向上列出這些季度 year quarter amount 1990 1 1.1 1990...