iT邦幫忙

0

Qlik語法問題1 請教

  • 分享至 

  • xImage

您好:
找到一小段程式碼如下
但不知如何解釋他?
1.比如:他設定了一個Link-Table:
但後面又join(Link-Table),他是跑遞迴嗎?

2.resident 收驗表頭;
他是直接使用 收驗表頭 嗎?
或者 收驗表頭 在其他地方 有Label過 ,拿來這邊用

3.最後一段又resident ddd;

4.之後又有
drop tables ddd;
drop fields 收驗單號,物流中心代號 from 收驗頭表;

會刪掉 使用的欄位嗎?

謝謝!

Link_Table:
load recv_header_pk, 收驗單號, 物流中心代號,
     year(收驗日期)  					as 年,
     '第'&ceil(month(收驗日期)/3)&'季' as 季,
     month(收驗日期)  					as 月,
     day(收驗日期)  					as 日
  resident 收驗頭表;
join(Link_Table)load recv_detail_pk,收驗單號,商品貨號
  resident 收驗明細表;
ddd:
load ship_header_key,出貨單號,物流中心代號,
  	 year(出貨日期)  					as 年,
  	 '第'&ceil(month(出貨日期)/3)&'季'  as 季,
  	 month(出貨日期)  					as 月,
  	 day(出貨日期)  					as 日
  resident 出貨頭表;
join (ddd) load ship_detail_pk,出貨單號,商品貨號
  resident 出貨明細表;
join (Link_Table)load ship_header_key,ship_detail_pk,
     出貨單號,物流中心代號,商品貨號,
  	 年,季,月,日
  resident ddd;
drop tables ddd;  	 
drop fields 收驗單號,物流中心代號 	from 收驗頭表;
drop fields 收驗單號,商品貨號    	from 收驗明細表; 
drop fields 出貨單號,物流中心代號 	from 出貨頭表; 
drop fields 出貨單號,商品貨號 		from 出貨明細表; 

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
richardsuma
iT邦大師 1 級 ‧ 2020-10-07 02:26:40

1.比如:他設定了一個Link-Table:
但後面又join(Link-Table),他是跑遞迴嗎?

內部表格加上標籤,以供具有 resident 子句的 LOAD 陳述式參考。
Link-Table: 在 QlikView 所表示的是 table label(表格標籤)。
join(Link-Table) 是 Link-Table 跟 收驗明細表 兩個table 做 合併 動作。

2.resident 收驗表頭;
他是直接使用 收驗表頭 嗎?
或者 收驗表頭 在其他地方 有Label過 ,拿來這邊用

resident 收驗表頭; 表示直接使用記憶體裡面還沒有被 drop table 的表格,
而這個表格之前就被 載入(LOAD) 到記憶體裡面了。

** 順帶說明一下,QlikView 所有的資料都會直接載入到記憶體裡面做計算,所以它會使用到很多的記憶體。 **

3.最後一段又resident ddd;

這段程式要這樣看:

Link_Table:
load recv_header_pk, 收驗單號, 物流中心代號,
year(收驗日期) as 年,
'第'&ceil(month(收驗日期)/3)&'季' as 季,
month(收驗日期) as 月,
day(收驗日期) as 日
resident 收驗頭表;

這個 join 是要 Link_Table 與 收驗明細表 兩個表格做合併。

join(Link_Table)load recv_detail_pk,收驗單號,商品貨號
resident 收驗明細表;

ddd:
load ship_header_key,出貨單號,物流中心代號,
year(出貨日期) as 年,
'第'&ceil(month(出貨日期)/3)&'季' as 季,
month(出貨日期) as 月,
day(出貨日期) as 日
resident 出貨頭表;

這個 join 是要 ddd 與 出貨明細表 兩個表格做合併。

join (ddd) load ship_detail_pk,出貨單號,商品貨號
resident 出貨明細表;

這個 join 是要 Link_Table 與 ddd 兩個表格做合併。

join (Link_Table)load ship_header_key,ship_detail_pk,
出貨單號,物流中心代號,商品貨號,
年,季,月,日
resident ddd;

4.之後又有
drop tables ddd;

會刪掉記憶體裡面的表格 ddd。

drop fields 收驗單號,物流中心代號 from 收驗頭表;

會刪掉記憶體裡面 收驗頭表 表格中的 收驗單號,物流中心代號 欄位。

會刪掉 使用的欄位嗎?

只會刪掉記憶體中的欄位,不會刪除 BI 建立的樞紐或表格或其他使用到欄位的物件。

noway iT邦研究生 3 級 ‧ 2020-10-10 21:49:52 檢舉

您好:謝謝您的回覆,想再請教一下
1.【Label:】會黏著以下的語法? 還是 可以空一行,他也會有作用?
斷點如何判斷?

2.這是一段

Link_Table:
load recv_header_pk, 收驗單號, 物流中心代號,
     year(收驗日期)  					as 年,
     '第'&ceil(month(收驗日期)/3)&'季' as 季,
     month(收驗日期)  					as 月,
     day(收驗日期)  					as 日
  resident 收驗頭表;
join(Link_Table)load recv_detail_pk,收驗單號,商品貨號
  resident 收驗明細表;

3.而這又是另一段嗎?還是裡面 分兩段?
這一段比較難去切分與解讀

ddd:
load ship_header_key,出貨單號,物流中心代號,
  	 year(出貨日期)  					as 年,
  	 '第'&ceil(month(出貨日期)/3)&'季'  as 季,
  	 month(出貨日期)  					as 月,
  	 day(出貨日期)  					as 日
  resident 出貨頭表;
join (ddd) load ship_detail_pk,出貨單號,商品貨號
  resident 出貨明細表;
join (Link_Table)load ship_header_key,ship_detail_pk,
     出貨單號,物流中心代號,商品貨號,
  	 年,季,月,日
  resident ddd;

出貨表投 JOIN 出貨明細 ==>ddd
再LINK_TABLE join ddd ==>再次變為 ddd

為何要這樣寫,他無法 JOIN A 再JIN B,再JOIN C?

4.所以在上面的 ,是先LOAD,後(下)面的才可以讀得到前面的?
有順序關係?

5.只會刪掉記憶體中的欄位,不會刪除 BI 建立的樞紐或表格或其他使用到欄位的物件。
BI建立的樞紐或表格,不是由 LOAD這邊的的資料欄位 帶出來的嗎?
BI建立的樞紐等應該也是從記憶體抓欄位及資料??
他在這邊刪除 有何用意?

謝謝!

1.【Label:】會黏著以下的語法? 還是 可以空一行,他也會有作用?
斷點如何判斷?
==>是的。 一般陳述式通常用於以某種方式操縱資料。這些陳述式可在指令碼中撰寫為任意行數,但是一定必須以分號 ";" 終止。

2. ==>其實這是兩段,每個分號是一段。

3. ==>這個是三段。 Qlikview 只要有兩個欄位的table,就會自動join, Link_Table 是為了要解決Qlikview 自動join 而產生的LOOP。

為何要這樣寫,他無法 JOIN A 再JIN B,再JOIN C?
==>其實你也可以按你的方式改寫,你就可以知道發生什麼事? 更清楚別人為什麼要這樣寫。

  1. 所以在上面的 ,是先LOAD,後(下)面的才可以讀得到前面的?
    有順序關係?
    ==>是的。有。

5.BI建立的樞紐或表格,不是由 LOAD這邊的的資料欄位 帶出來的嗎?
==>是的。

BI建立的樞紐等應該也是從記憶體抓欄位及資料??
==>建立的樞紐是從資料庫或其他資料檔案LOAD到記憶體, Qlikview會自動join,所以運作都在記憶體裡面。

他在這邊刪除 有何用意?
==>避免Qlikview自動join產生key,發生LOOP錯誤,所以要做刪除的動作,我都會把所有產生的table刪掉,不是只刪除欄位而已。

noway iT邦研究生 3 級 ‧ 2020-10-13 22:54:41 檢舉

您好:
所以
2.

Link_Table:
load recv_header_pk, 收驗單號, 物流中心代號,
     year(收驗日期)  					as 年,
     '第'&ceil(month(收驗日期)/3)&'季' as 季,
     month(收驗日期)  					as 月,
     day(收驗日期)  					as 日
  resident 收驗頭表;
join(Link_Table)load recv_detail_pk,收驗單號,商品貨號
  resident 收驗明細表;

這邊,是先產生了一個Link_Table(來源:收驗表頭)
再 設定 與 收驗明細表 做關聯
關聯欄位 recv_detail_pk

ddd:
load ship_header_key,出貨單號,物流中心代號,
  	 year(出貨日期)  					as 年,
  	 '第'&ceil(month(出貨日期)/3)&'季'  as 季,
  	 month(出貨日期)  					as 月,
  	 day(出貨日期)  					as 日
  resident 出貨頭表;
  
join (ddd) load ship_detail_pk,出貨單號,商品貨號
  resident 出貨明細表;
join (Link_Table)load ship_header_key,ship_detail_pk,
     出貨單號,物流中心代號,商品貨號,
  	 年,季,月,日
  resident ddd;
  
ddd: 基礎為 出貨頭表;
接著出貨明細表與ddd 做關聯  (出貨單號 關聯欄位)  

再設定 ddd(出貨頭表 為基礎)  與 Link_Table 做關聯 (關聯欄位 :出貨單號,物流中心代號)

這邊都只是做關聯,並沒有 虛擬出一個 新的TABLE
DDD仍只有 出貨頭表

另外:
Qlikview 只要有兩個欄位的table,就會自動join
是否有同名才會JOIN,不然 不會自動JOIN???

只會刪掉記憶體中的欄位,不會刪除 BI 建立的樞紐或表格或其他使用到欄位的物件
這一段,仍較沒概念
A.會刪掉記憶體中的欄位:這是指單純LOAD 到記憶體的欄位? 有資料嗎?

B.BI 建立的樞紐或表格或其他使用到欄位的物件:這是指QVW看到的資料? 這些資料存在QVW中,不是在記憶體?
LOaD 按鈕重新LOAD 資料後,就存在QVW中,不是記憶體?

謝謝!

我要發表回答

立即登入回答