---
schema_version: "1"
id: 33d9de7e7dbb6b0246c98d0fa939fabcdd06de0afeb5202803124c6431544484
title: Procedure consigliate per la creazione di calcoli in Tableau
collection: tableau
version: next
locale: it-it
portal_url: https://docs.salesforce.com/tableau/next/it-it/pro/desktop/calculations_calculatedfields_bestpractices.md
canonical_url: https://help.tableau.com/v0.0/pro/desktop/it-it/calculations_calculatedfields_bestpractices.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 5fd87ce654f40d896782f00af214a3c38e2e10eba6d8f5864cdca442b19ba0a0
description: Tips and guidelines for creating efficient calculations in Tableau to optimize workbook performance.
---
[Passa al contenuto principale](#main-content)

# Procedure consigliate per la creazione di calcoli in Tableau

Questo articolo illustra diversi suggerimenti e linee guida per la creazione di calcoli efficienti in Tableau. Queste linee guida sono concepite per ottimizzare le prestazioni della cartella di lavoro. Per ulteriori informazioni su tutti i modi in cui è possibile migliorare le prestazioni della cartella di lavoro, consulta la sezione [Ottimizzare le prestazioni delle cartelle di lavoro](https://help.tableau.com/v0.0/pro/desktop/it-it/performance_tips.htm).

## Regola generale: evita di utilizzare più volte un campo calcolato in un altro calcolo

Se si fa riferimento allo stesso campo calcolato più volte all’interno di un altro calcolo, si verificheranno problemi di prestazioni. Se si utilizza un campo calcolato in un calcolo (noto anche come creazione di calcoli nidificati), cerca di farvi riferimento solo una volta per calcolo.

Nota che il riferimento a un campo (campo terminale) ripetuto più volte in un calcolo non influisce negativamente sulle prestazioni.

### Esempio

Supponiamo di creare un campo calcolato che utilizza un complicato calcolo a linee multiple per trovare menzioni, o account Twitter, nei tweet. Il campo calcolato si chiama Account Twitter. Ogni account che viene restituito inizia con il segno "@" (ad esempio: @user).

Per l’analisi, vuoi rimuovere il simbolo “@”.

A tale scopo, è possibile utilizzare il seguente calcolo per rimuovere il primo carattere dalla stringa:

`RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)`

Questo calcolo è piuttosto semplice. Tuttavia, poiché fa riferimento due volte al calcolo dell’account Twitter, esegue due volte il calcolo per ogni record dell’origine dati: una volta per la funzione RIGHT e una per la funzione LEN.

Per evitare di fare lo stesso calcolo più di una volta, puoi riscrivere il calcolo trasformandolo in uno che utilizza il calcolo dell’account Twitter solo una volta. In questo esempio è possibile utilizzare la funzione MID per ottenere lo stesso risultato:

`MID([Twitter Handle], 2)`

## Suggerimento 1: converti i confronti multipli di uguaglianza in un’espressione CASE o in un gruppo

Supponiamo di avere il seguente calcolo, che utilizza più volte il campo calcolato Person (calc) e impiega una serie di funzioni OR. Questo calcolo, sebbene sia una semplice espressione logica, causa problemi di prestazioni delle query perché esegue il calcolo Person (calc) almeno dieci volte.

`IF [Person (calc)] = 'Henry Wilson'   OR [Person (calc)] = 'Jane Johnson'   OR [Person (calc)] = 'Michelle Kim'   OR [Person (calc)] = 'Fred Suzuki'   OR [Person (calc)] = 'Alan Wang'   THEN 'Lead'   ELSEIF [Person (calc)] = 'Susan Nguyen'   OR [Person (calc)] = 'Laura Rodriguez'   OR [Person (calc)] = 'Ashley Garcia'   OR [Person (calc)] = 'Andrew Smith'   OR [Person (calc)] = 'Adam Davis'   THEN 'IC'   END`

Anziché utilizzare un confronto di uguaglianza, prova le soluzioni seguenti.

### Soluzione 1

Utilizza un’espressione CASE. Ad esempio:

`CASE [Person (calc)]   WHEN 'Henry Wilson' THEN 'Lead'   WHEN 'Jane Johnson' THEN 'Lead'   WHEN 'Michelle Kim' THEN 'Lead'   WHEN 'Fred Suzuki' THEN 'Lead'   WHEN 'Alan Wang' THEN 'Lead'      WHEN 'Susan Nguyen' THEN 'IC'   WHEN 'Laura Rodriguez' THEN 'IC'   WHEN 'Ashley Garcia' THEN 'IC'   WHEN 'Andrew Smith' THEN 'IC'   WHEN 'Adam Davis' THEN 'IC'   END`

In questo esempio, il campo calcolato, Person (calc), viene citato solo una volta. Viene pertanto eseguito una sola volta. Anche le espressioni CASE sono ulteriormente ottimizzate nell’ordine delle query per ottenere un ulteriore vantaggio in termini di prestazioni.

### Soluzione 2

Crea un gruppo invece di un campo calcolato. Per maggiori informazioni, consulta [Raggruppare i dati](https://help.tableau.com/v0.0/pro/desktop/it-it/sortgroup_groups_creating.htm).

## Suggerimento 2: converti più calcoli stringa in un’unica espressione REGEXP

**Nota**: i calcoli REGEXP sono disponibili solo se si utilizzano estrazioni dati di Tableau o se ci si collega a origini dati file di testo, Hadoop Hive, Google BigQuery, PostgreSQL, Estrazione dati Tableau, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (versione 14.1 e successive) e Oracle. Per ulteriori informazioni, consulta [Funzioni aggiuntive (Regex, Hadoop Hive, Google Big Query)](https://help.tableau.com/v0.0/pro/desktop/it-it/functions_functions_additional.htm).

  

### Esempio 1: CONTIENE

Supponiamo di avere il calcolo seguente, che utilizza più volte il campo calcolato Category (calc). Questo calcolo, sebbene sia una semplice espressione logica, causa problemi di prestazioni delle query, poiché esegue il calcolo Category (calc) più volte.

`IF CONTAINS([Segment (calc)],'UNKNOWN')   OR CONTAINS([Segment (calc)],'LEADER')   OR CONTAINS([Segment (calc)],'ADVERTISING')   OR CONTAINS([Segment (calc)],'CLOSED')   OR CONTAINS([Segment (calc)],'COMPETITOR')   OR CONTAINS([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

Puoi usare un’espressione REGEXP per ottenere gli stessi risultati senza tante ripetizioni.

#### Soluzione

`IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

  

Con calcoli stringa che utilizzano un modello simile, puoi utilizzare la stessa espressione REGEXP.

### Esempio 2: INIZIA CON

`IF STARTSWITH([Segment (calc)],'UNKNOWN')   OR STARTSWITH([Segment (calc)],'LEADER')   OR STARTSWITH([Segment (calc)],'ADVERTISING')   OR STARTSWITH([Segment (calc)],'CLOSED')   OR STARTSWITH([Segment (calc)],'COMPETITOR')   OR STARTSWITH([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'`

#### Soluzione

`IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

Nota che in questa soluzione si utilizza il simbolo '^'.

### Esempio 3: FINISCE CON

`IF ENDSWITH([Segment (calc)],'UNKNOWN')   OR ENDSWITH([Segment (calc)],'LEADER')   OR ENDSWITH([Segment (calc)],'ADVERTISING')   OR ENDSWITH([Segment (calc)],'CLOSED')   OR ENDSWITH([Segment (calc)],'COMPETITOR')   OR ENDSWITH([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

#### Soluzione

`IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

Nota che in questa soluzione si utilizza il simbolo '$' .

## Suggerimento 3: lavora utilizzando stringhe con REGEXP anziché LEFT, MID, RIGHT, FIND, LEN

Le espressioni regolari possono essere uno strumento molto potente. Quando si eseguono operazioni di manipolazione complesse delle stringhe, è consigliabile utilizzare espressioni regolari. In molti casi, l’utilizzo di un’espressione regolare avrà come risultato un calcolo più corto e più efficiente. Per ulteriori informazioni sulle espressioni regolari, consulta il post [Diventare un habitué delle regex e confrontarsi con dati imperfetti.](https://www.tableau.com/it-it/about/blog/2015/6/become-regular-regular-expressions-39802) sul blog di Tableau.

### Esempio 1

Supponiamo di avere il calcolo seguente, che rimuove i protocolli dagli URL. Ad esempio: "https://www.tableau.com" diventa "www.tableau.com".

`IF (STARTSWITH([Server], "http://")) THEN   MID([Server], Len("http://") + 1)   ELSEIF(STARTSWITH([Server], "https://")) THEN   MID([Server], Len("https://") + 1)   ELSEIF(STARTSWITH([Server], "tcp:")) THEN   MID([Server], Len("tcp:") + 1)   ELSEIF(STARTSWITH([Server], "\\")) THEN   MID([Server], Len("\\") + 1)   ELSE [Server]   END`

#### Soluzione

È possibile semplificare il calcolo e migliorare le prestazioni utilizzando una funzione REGEXP\_REPLACE.

`REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", " )`

### Esempio 2

Supponiamo di avere il seguente calcolo, che fornisce la seconda parte di un indirizzo IPv4. Ad esempio: "172.16.0.1" diventa "16".

`IF (FINDNTH([Server], ".", 2) > 0) THEN   MID([Server],   FIND([Server], ".") + 1,   FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1   )   END`

#### Soluzione

È possibile semplificare il calcolo e migliorare le prestazioni utilizzando una funzione REGEXP\_EXTRACT.

`REGEXP_EXTRACT([Server], "\.([^\.]*)\.")`

## Suggerimento 4: non utilizzare insiemi nei calcoli

Se utilizzi gli insiemi in un calcolo, considera la possibilità di sostituirli con un calcolo alternativo, ma equivalente.

### Esempio

Supponiamo di avere il seguente calcolo che utilizza l’insieme Top Customers (set).

`IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END`

### Soluzione 1

Se l’insieme è semplice, è possibile creare un campo calcolato che dia lo stesso risultato dell’insieme. Ad esempio:

`CASE [Customer Name]   WHEN 'Henry Wilson' THEN True   WHEN 'Jane Johnson' THEN True   WHEN 'Michelle Kim' THEN True   WHEN 'Fred Suzuki' THEN True   WHEN 'Alan Wang' THEN True   ELSE False   END`

  

**Nota**: in questa situazione si consiglia di utilizzare il modello SE VERO ..... ALTRIMENTI per evitare problemi di prestazioni dovuti all’uso degli insiemi. Si tratta di un modello non consigliato nella maggior parte degli scenari.

### Soluzione 2

Se l’insieme è più complesso, è consigliabile creare un gruppo che mappi tutti gli elementi dell’insieme a un valore o attributo specifico, come ad esempio 'IN', e quindi modifica il calcolo per controllare tale valore/attributo. Ad esempio:

`IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END`

Per ulteriori informazioni, consulta [Raggruppare i dati](https://help.tableau.com/v0.0/pro/desktop/it-it/sortgroup_groups_creating.htm) e [Creare insiemi](https://help.tableau.com/v0.0/pro/desktop/it-it/sortgroup_sets_create.htm).

## Suggerimento 5: non utilizzare insiemi per raggruppare i dati

Gli insiemi hanno lo scopo di effettuare confronti su sottoinsiemi di dati. I gruppi hanno lo scopo di combinare i membri correlati in un campo. Non è consigliabile convertire insiemi come nell’esempio seguente:

`IF [Americas Set] THEN "Americas"   ELSEIF [Africa Set] THEN "Africa"   ELSEIF [Asia Set] THEN "Asia"   ELSEIF [Europe Set] THEN "Europe"   ELSEIF [Oceania Set] THEN "Oceania"   ELSE "Unknown"   END`

Questa soluzione non è consigliata per i seguenti motivi:

- **Non sempre gli insiemi sono esclusivi**. Alcuni elementi possono comparire in più insiemi. Ad esempio, la Russia può essere inserita sia nell’insieme Europa che nell’insieme Asia.
- **Non sempre gli insiemi possono essere convertiti in gruppi**. Se gli insiemi sono definiti per esclusione, condizioni o limiti, è possibile che sia difficile o addirittura impossibile creare un gruppo equivalente.

### Soluzione

Raggruppa i dati utilizzando la funzione Gruppo. Per maggiori informazioni, consulta [Raggruppare i dati](https://help.tableau.com/v0.0/pro/desktop/it-it/sortgroup_groups_creating.htm).

## Vedi anche

[Creare calcoli efficienti](https://help.tableau.com/v0.0/pro/desktop/it-it/perf_efficient_calcs.htm)

[Ottimizzare le prestazioni delle cartelle di lavoro](https://help.tableau.com/v0.0/pro/desktop/it-it/performance_tips.htm)

[Tipi di calcoli in Tableau](https://help.tableau.com/v0.0/pro/desktop/it-it/calculations_calculatedfields_understand_types.htm)

[Funzioni in Tableau](https://help.tableau.com/v0.0/pro/desktop/it-it/functions.htm)