當前位置:首頁 » 編程語言 » 維度sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

維度sql

發布時間: 2022-05-31 18:19:03

1. sql server 2008 r2 數據倉庫怎樣畫出事實表和維度表

可以通過SQL SERVER的數據轉換服務轉為excel,在SQL SERVER的企業管理器裡面,右鍵「所有任務」-「附加資料庫」,找到這個mdf文件然後確定。下一步就是轉換了。在SQL SERVER的企業管理器裡面,選擇要轉換的資料庫,「所有任務」-「導出資料庫」,源數據不用動,下一步目的數據,驅動選擇帶excel字樣的那個,下幾步選擇好要轉換的資料庫表。

2. 數據量大,維度多怎麼sql做查詢,

1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
若要提高效率,可以考慮全文檢索。
7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--『2005-11-30』生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)
13.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。
17.盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。
19.任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。
20.盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。
21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
22.臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。
23.在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。
24.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。
26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
27.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。
29.盡量避免大事務操作,提高系統並發能力。
30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

3. SQL語句含義

給出的sql不全只能給你這樣解釋了:
1、外層的其他數據 應該直接來自內層某表。
2、a.滿意等級來自內層的計算。
如下
case when a.satisfactionstar in(4,5)
then '滿意'
when a.satisfactionstar in(3)
then '一般'
when a.satisfactionstar in(1,2)
then '不滿意'
else '其他'
end as 滿意等級,
對上述語句的解釋:
當 a.satisfactionstar 的值 為4 或者5時 整個語句的值為『滿意』 別名 為滿意等級。
同理 當 a.satisfactionstar 的值 為3 時 整個語句的值為『一般』 ,
當 a.satisfactionstar 的值 為1 或者2 時 整個語句的值為『不滿意』
當 a.satisfactionstar 的值 不為上述值 時 整個語句的值為『其他』
這個值就是外層的 a.滿意等級。
就是case when 的一種用法 跟decode 方法的功能差不多。

4. sql可以把不同緯度的,進行統計,在一個語句里選出來嗎,比如下表

  1. selectage,count(1)count
    from表
    groupbyage
  2. selectage,type,count(1)count
    from表
    groupbyage,type

5. 在sql2008中如何將列的維度變成行的指標

select id,語文=isnull(sum(case 成績 when '語文' then 成績 end),0),
數學=isnull(sum(case 成績 when '數學' then 成績 end),0),
英語=isnull(sum(case 成績 when '英語' then 成績 end),0),
物理=isnull(sum(case 成績 when '物理' then 成績 end),0),
化學=isnull(sum(case 成績 when '化學' then 成績 end),0)
from 表名
group by id
order by id
手寫的,沒有測試,你先試試

6. SQL2008R2中,如何將行指標轉換為列維度

select fid, 會試年度, 備注, 省份,
sum(case when 期間=1 and 預算金額='費用' then 金額 end) 期間1預算費用,
sum(case when 期間=1 and 預算金額='目標' then 金額 end) 期間1預算目標,
sum(case when 期間=2 and 預算金額='費用' then 金額 end) 期間2預算費用,
sum(case when 期間=2 and 預算金額='目標' then 金額 end) 期間2預算目標,
sum(case when 期間=3 and 預算金額='費用' then 金額 end) 期間3預算費用,
sum(case when 期間=3 and 預算金額='目標' then 金額 end) 期間3預算目標
from 表
group by fid, 會試年度, 備注, 省份
如果是期間與預算金額是不定的,那你只能自己先查出期間和預算金額,然後拼sql再動態執行

7. Sql 以id為維度,選不重復的

Sql 以id為維度,選不重復信息如下列出SQL語句:
方案一:distinct
select distinct name from table
方案二:group by
select min(fid),name,sex from table group by name
方案三:
select * from table where name in(select name from table group by name having count(name)=2)
以上三個語句,能將sql資料庫里不重復的信息篩選出來。

8. sql server 2000 怎麼建立維度表

有兩種方法1,在新建查詢里可以用代碼建create table 表名{}
2,直接手動操作,在自己建的資料庫中,點擊+號,在下面出現表,在表上點擊右鍵,再點新建 ,希望對你有所幫助。

9. sql中,不同維度的相同度量行轉列,我試了不用join得不到結果,有高手不用join,一個sql,可以解決嗎

既然JOIN能通過,那麼必然有不用JOIN的方法。

下面不用JOIN,一句SQL語句解決。

select t1.file1 as 公司,t1.file2 as 項目,t1.file3 as 工程師類別,
t1.Q1 as 工程師類別維度工程師數,
t2.Q2 as 項目維度工程師數 from
(select file1,file2,file3,count(*) as Q1 from 表名 group by file1,file2,file3)t1,
(select file1,file2 ,count(*) as Q2 from 表名 group by file1,file2)t2
where t1.file1=t2.file1 and t1.file2=t2.file2
order by t1.file1,t1.file2,t1.file3

如果我沒有正確理解你的意圖,請告訴我,我重新編寫代碼。

10. 什麼是資料庫維度 怎麼理解怎麼用做什麼用的 能否通俗易懂的說明。謝謝。

舉個簡單例子:

就拿excel表格來說,作為單一的工作表,就包含二維(行和列),而一個excel文件,通常包含多個工作表,打開excel文件時,在下方顯示的「sheet1、sheet2」這些工作表頁列,就是第三維

excel是最簡單的資料庫應用,一個xlsx文件只有三維,但你可以用若干個xlsx文件來組成一個項目,這些文件序列,你可以視為第四維

然後,你還可以把一組組xlsx文件放在一個個目錄中,那麼這些目錄序列,你可以視為第五維

再往上,你還可以設置更上一級目錄,那就是第六維……

反正在excel中,任何一個單元格,都可以調用存儲在本地電腦(甚至是網路電腦)任何地方的、任何一個excel文件中的、任何一個工作表的、任何一個單元格內容,所以說,雖然是一大堆的文件,你也可以當做是一個資料庫來處理,只是不那麼方便。

……

在資料庫中,單一的資料庫就能包含很多很多維,你也可以把這些維,當做樹狀目錄的結構來理解,也可以當做一堆堆的xlsx文件集合來理解。

磁碟的存儲結構(不管是fat還是ntfs,還是linux或os或別的什麼磁碟格式),是一種大型的、多維的資料庫,分區是一個維度,目錄是一個維度,每一檔下級目錄又是一個維度。文件是一個維度,文件中的章節行段也是維度……

數學中的維度概念,和通常意義上的空間維度,是兩回事。

空間維度可以用數學來解釋,但數學維度,三維以上你就無法用空間來顯示。

在資料庫中,三維只是基本操作

……

用excel來舉例,已經是我能找到的最容易理解的方案。

我真正理解資料庫維度時,是從數組開始的,當時使用一個很簡陋的編程軟體,他不提供資料庫建立和訪問,數組的維度也有限,還需要自己建立多維存儲文件,並且只支持文本格式。

文本格式中,使用【】標記數組維度,【】中間的標識符可以自定義,通過各種不同的標識符來延伸維度……做著做著,我忽然間就領悟到什麼叫資料庫、什麼叫維度,如果不考慮執行效率的話,用一個文本文件,就能模擬出一個硬碟來……