# 衍生欄位

如果您有一組相關的欄位，或者如果欄位包含的資訊可在建立維度或量值時被分成相關的較小部分，您可以建立用於產生衍生欄位的欄位定義。比如說日期欄位，您可以從中衍生出多個屬性，例如年、月、週數或日名稱。所有這些屬性都可以使用 Qlik Sense 日期函數在維度運算式中計算，但也可以選擇建立適用於所有日期類型欄位的行事曆定義。欄位定義儲存在資料載入指令碼中。

資訊備註Qlik Sense 的預設行事曆欄位定義包含在使用資料管理員載入的日期欄位的 autoCalendar 中。如需更多資訊，請參閱 [使用自動行事曆自動衍生日期欄位](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/derived-fields.htm#Automati) 和 [從連線和新的檔案將資料新增至應用程式](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/adding-data.htm)。

## 宣告行事曆欄位定義

您使用 Declare 陳述式建立衍生欄位的定義。這就是您定義欄位的各項屬性的地方，具體是指日期相關屬性。每個欄位描述如下：`<expression> As field_name tagged tag`。設定一個或多個標記是可選的，但是這會影響衍生欄位的排序順序。使用 `$1` 參照資料欄位，衍生欄位應從該資料欄位產生。

警告備註 除非您建立自己的自動行事曆或處理透過 資料管理員 建立的自動設定 `[autoCalendar]`，否則請勿使用 autoCalendar 作為行事曆欄位定義的名稱。此名稱要保留給自動產生的行事曆範本使用。請參閱 [使用自動行事曆自動衍生日期欄位](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/derived-fields.htm#Automati)。

```
Calendar:
DECLARE FIELD DEFINITION TAGGED '$date'
   Parameters
      first_month_of_year = 1
   Fields
      Year($1) As Year Tagged ('$numeric'),
      Month($1) as Month Tagged ('$numeric'),
      Date($1) as Date Tagged ('$date'),
      Week($1) as Week Tagged ('$numeric'),
      Weekday($1) as Weekday Tagged ('$numeric'),
      DayNumberOfYear($1, first_month_of_year) as DayNumberOfYear Tagged ('$numeric');
```

如需詳細資訊，請參閱[Declare](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Declare.htm)。

## 使用 Derive 將資料欄位對應至行事曆

下一步是使用 Derive 陳述式將現有資料欄位對應至行事曆。此操作會建立衍生的欄位。您可以在資料載入指令碼中採用三種替代方法執行此操作：

* 使用欄位名稱對應特定欄位。

  ```
  DERIVE FIELDS FROM FIELDS OrderDate,ShippingDate USING Calendar;
  ```

* 使用一個或多個特定欄位標記對應所有欄位。

  ```
  DERIVE FIELDS FROM EXPLICIT TAGS ('$date') USING Calendar;
  ```

* 對應所有使用其中一個欄位定義標記標示的欄位 (在上面的範例中為 $date)。

  ```
  DERIVE FIELDS FROM IMPLICIT TAG USING Calendar;
  ```

這種情況下，您可以使用三種範例中的任何一種。

如需詳細資訊，請參閱[Derive](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Derive.htm)。

## 使用自動行事曆自動衍生日期欄位

若您使用 資料管理員 建置應用程式並載入資料，名稱為 [autoCalendar] 的行事曆會自動插入到載入指令碼中，以提供預設行事曆定義。這些可見於應用程式的商務邏輯。

對於使用指令碼撰寫建立且包含日期欄位的應用程式，您可以在載入所有適用日期欄位之後，在區段的指令碼中插入此 [autoCalendar] 程式碼，如下所示。這可讓應用程式使用者使用所有可用的期間式分析類型，包括可以建置智慧型工作表的類型。請注意，行事曆的標題必須是 [autocalendar]，以便在商務邏輯中正確新增行事曆期間。

修改行 DERIVE FIELDS FROM FIELDS [My\_Date\_Field1], [My\_Date\_Field2] USING [autoCalendar] ; 中的 [My\_Date\_Field1] 和 [My\_Date\_Field2] 欄位名稱，以連結日期欄位與產生新衍生之日期欄位的自動行事曆計算。若您只有一個日期欄位可連結至自動行事曆，請移除 [My\_Date\_Field2]。 類似地，若您有超過兩個日期欄位可啟用自動行事曆，則新增其他日期欄位。

```
[autoCalendar]:
  DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS		
  Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis', '$year'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Quarter] Tagged ('$quarter', '$cyclic'),
  Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [YearQuarter] Tagged ('$yearquarter', '$qualified'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [_YearQuarter] Tagged ('$yearquarter', '$hidden', '$simplified'),
  Month($1) AS [Month] Tagged ('$month', '$cyclic'),
  Dual(Year($1)&'-'&Month($1), monthstart($1)) AS [YearMonth] Tagged ('$axis', '$yearmonth', '$qualified'),
  Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
  Dual('W'&Num(Week($1),00), Num(Week($1),00)) AS [Week] Tagged ('$weeknumber', '$cyclic'),
  Date(Floor($1)) AS [Date] Tagged ('$axis', '$date', '$qualified'),
  Date(Floor($1), 'D') AS [_Date] Tagged ('$axis', '$date', '$hidden', '$simplified'),
  If (DayNumberOfYear($1) <= DayNumberOfYear(Today()), 1, 0) AS [InYTD] ,
  Year(Today())-Year($1) AS [YearsAgo] ,
  If (DayNumberOfQuarter($1) <= DayNumberOfQuarter(Today()),1,0) AS [InQTD] ,
  4*Year(Today())+Ceil(Month(Today())/3)-4*Year($1)-Ceil(Month($1)/3) AS [QuartersAgo] ,
  Ceil(Month(Today())/3)-Ceil(Month($1)/3) AS [QuarterRelNo] ,
  If(Day($1)<=Day(Today()),1,0) AS [InMTD] ,
  12*Year(Today())+Month(Today())-12*Year($1)-Month($1) AS [MonthsAgo] ,
  Month(Today())-Month($1) AS [MonthRelNo] ,
  If(WeekDay($1)<=WeekDay(Today()),1,0) AS [InWTD] ,
  (WeekStart(Today())-WeekStart($1))/7 AS [WeeksAgo] ,	
  Week(Today())-Week($1) AS [WeekRelNo] ;

DERIVE FIELDS FROM FIELDS [My_Date_Field1], [My_Date_Field2] USING [autoCalendar] ;
```

若正確進行，將會在應用程式的商務邏輯中自動建立行事曆期間數量，您將能夠在 Insight Advisor 中使用期間式分析類型。

如需詳細資訊，請參閱[為期間式分析使用 Insight Advisor 中的智慧型工作表](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Insights/insight-advisor-smart-sheets.htm)。

## 在視覺化中使用衍生日期欄位

如果您已建立行事曆定義並像上述範例一樣對應了欄位，那麼 Qlik Sense 即可識別衍生日期欄位了。它們在欄位資產面板的日期與時間欄位區段可用。當您建立或編輯維度時，您還會在運算式編輯器中發現所有衍生欄位。

如需詳細資訊，請參閱[日期與時間欄位](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Assets/date-time-fields.htm)。