---
schema_version: "1"
id: dffe1c8109c23b46a04cff8cda15b66838c923faf2bb5d2ac681ac560472b5b9
title: วิเคราะห์ด้วยด้วยวันที่สองใน Tableau Desktop
collection: tableau
version: current
locale: th-th
portal_url: https://docs.salesforce.com/tableau/current/th-th/prep/prep_tutorial_2nddateB.md
canonical_url: https://help.tableau.com/current/prep/th-th/prep_tutorial_2nddateB.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 0d941ffa248a448b1a2aafe930ee849d2ecd1dacbb4c60110f0e8bcae8e4c356
description: "tutorial: analyze the second-date data set in Tableau Desktop."
---
[ข้ามไปยังเนื้อหาหลัก](#main-content)

# วิเคราะห์ด้วยด้วยวันที่สองใน Tableau Desktop

นี่คือช่วงที่สองของบทแนะนำและถือว่าช่วงแรก [การค้นหาวันที่ที่สองด้วย Tableau Prep](https://help.tableau.com/current/prep/th-th/prep_tutorial_2nddateA.htm) เสร็จสมบูรณ์แล้ว

ในช่วงแรก เรานำชุดข้อมูลเดิมมาสร้างเพื่อตอบคำถามต่อไปนี้

1. ระยะเวลาเป็นจำนวนวันระหว่างการละเมิดครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่แต่ละคนคือกี่วัน
2. เปรียบเทียบจำนวนเงินค่าปรับสำหรับการละเมิดครั้งแรกและครั้งที่สอง มีความสัมพันธ์กันหรือไม่
3. ผู้ขับขี่รายใดจ่ายโดยรวมมากที่สุด ใครจ่ายน้อยที่สุด
4. มีผู้ขับขี่กี่คนที่มีการละเมิดหลายประเภท
5. จำนวนเงินค่าปรับโดยเฉลี่ยสำหรับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถคือเท่าใด

เมื่อเราสำรวจคำถามเหล่านี้ จะเห็นได้ชัดเจนว่าโครงสร้างข้อมูลแรกที่เราสร้างขึ้นมีทั้งข้อดีและข้อเสีย เราจะกลับไปที่ Tableau Prep Builder และเปลี่ยนรูปแบบเพิ่มเติม จากนั้นดูว่าส่งผลต่อการวิเคราะห์เดียวกันใน Tableau Desktop อย่างไร ท้ายที่สุด เราจะดูแนวทาง Tableau Desktop เท่านั้นเพื่อวิเคราะห์นิพจน์ระดับรายละเอียด (LOD) ด้วยข้อมูลเดิม

เป้าหมายของบทแนะนำนี้คือการนำเสนอแนวคิดต่างๆ ในบริบทของสถานการณ์ในชีวิตจริง และทำงานผ่านตัวเลือกต่างๆ ไม่ใช่การกำหนดโดยบังคับว่าข้อใดดีที่สุด ในตอนท้าย คุณควรจะมีความเข้าใจมากขึ้นว่าโครงสร้างข้อมูลส่งผลต่อการคำนวณและการวิเคราะห์อย่างไร เช่นเดียวกับความคุ้นเคยกับแง่มุมต่างๆ ของ Tableau Prep และการคำนวณใน Tableau Desktop ที่มากขึ้น

**หมายเหตุ**: หากต้องการทำงานในบทแนะนำนี้ให้เสร็จสิ้น คุณต้องมี Tableau Prep Builder และติดตั้ง Tableau Desktop และข้อมูลที่ดาวน์โหลด  
  
หากต้องการติดตั้ง Tableau Prep และ Tableau Desktop ก่อนดำเนินบทแนะนำนี้ต่อ โปรดดู [คู่มือ Tableau Desktop และ Tableau Prep Deployment](https://help.tableau.com/current/desktopdeploy/th-th/desktop_deploy_welcome.htm#) หรือคุณสามารถดาวน์โหลด [Tableau Prep](https://www.tableau.com/th-th/products/prep/download) และ [Tableau Desktop](https://www.tableau.com/th-th/products/desktop/download) เพื่อทดลองใช้ฟรีได้  
  
ชุดข้อมูลเป็นเอาท์พุตจาก [Driver Infractions.tflx](https://mkt.tableau.com/PrepTutorials/Driver%20Infractions.tflx) ซึ่งสร้างในช่วงแรก

## การวิเคราะห์ใน Tableau Desktop

ในขณะนี้เราได้กำหนดค่าข้อมูลแล้ว เราจะป้อนข้อมูลไปยัง Tableau Desktop เราสามารถตอบคำถามบางข้อได้อย่างง่ายดาย แต่บางคำถามก็เกี่ยวข้องกับการคำนวณเล็กน้อย (หรือมาก) ลองใช้คำถามด้านล่าง คุณสามารถขยายแต่ละคำถามเพื่อดูข้อมูลพื้นฐานเกี่ยวกับวิธีดำเนินการหากคุณติดขัด

**หมายเหตุ**: คุณสามารถดาวน์โหลดเวิร์กบุ๊ก [Driver Infractions.twbx](https://mkt.tableau.com/th-th/PrepTutorials/Driver%20Infractions.twbx) เพื่อดูโซลูชันในบริบท โปรดจำไว้ว่าอาจมีวิธีอื่นในการตีความการวิเคราะห์หรือหาคำตอบ

1\. ระยะเวลาเป็นจำนวนวันระหว่างการละเมิดครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่แต่ละคนคือกี่วัน

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราจะใช้ฟังก์ชัน DATEDIFF ฟังก์ชันนี้ใช้การอภิปรายสามส่วน ได้แก่ ส่วนวันที่ วันที่เริ่มต้น และวันที่สิ้นสุด เนื่องจากเราต้องการทราบวันระหว่างเหตุการณ์เหล่านี้ เราจะใช้ส่วนวันที่ “วัน” วันที่เริ่มต้นและสิ้นสุดของเราในชุดข้อมูลเป็น**วันที่ละเมิดครั้งที่ 1**และ**วันที่ละเมิดครั้งที่ 2**
2. การคำนวณ:
    
    **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])`
3. เราสามารถพล็อตข้อมูลนั้นเทียบกับ **ID ผู้ขับขี่**เป็นแผนภูมิแท่งได้ โปรดทราบว่าผู้ขับขี่เจ็ดคนไม่มีการละเมิดครั้งที่สอง ดังนั้นจึงเป็น null เจ็ดค่า
    
    ![แผนภูมิแท่งของผู้ขับขี่ตามเวลาระหว่างการละเมิด](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_1desktopI.png)

2\. เปรียบเทียบจำนวนเงินค่าปรับสำหรับการละเมิดครั้งแรกและครั้งที่สอง มีความสัมพันธ์กันหรือไม่

1. เพื่อที่จะตอบคำถามนี้ใน Tableau Desktop เราจะสร้างแผนภาพการกระจาย**จำนวนเงินค่าปรับครั้งที่ 1**และ**จำนวนเงินค่าปรับครั้งที่ 2** ด้วยการป้อน **ID ผู้ขับขี่**ไปยังแถบรายละเอียดบนการ์ดเครื่องหมาย เราสามารถสร้างเครื่องหมายสำหรับผู้ขับขี่แต่ละคนได้
2. หากต้องการเพิ่มเส้นแนวโน้ม ให้ใช้แท็บการวิเคราะห์ ในแผงด้านซ้ายและนำเส้นแนวโน้มแนวนอนออกมา เมื่อวางเมาส์เหนือเส้นแนวโน้ม เราจะเห็นว่าค่า R-squared นั้นแทบจะเป็นศูนย์ และ P-Value นั้นสูงกว่าจุดตัดที่สำคัญมาก เราสามารถระบุได้ว่าไม่มีความสัมพันธ์กันระหว่างจำนวนเงินค่าปรับครั้งที่แรกและครั้งที่สอง
    
    หากเราจะใช้แผนภาพการกระจายนี้ในแดชบอร์ด เส้นแนวโน้มควรถูกลบออก

![แผนภาพการกระจายของจำนวนเงินค่าปรับครั้งที่ 1 และครั้งที่ 2 ตาม ID ผู้ขับขี่ พร้อมแสดงคำแนะนำแนวโน้ม Tooltip](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_1desktopII.png)

3\. ผู้ขับขี่รายใดจ่ายโดยรวมมากที่สุด ใครจ่ายน้อยที่สุด

เมื่อเราต้องการลงลึกในการวิเคราะห์ของเรา เราอาจจำเป็นต้องสร้างการคำนวณบางอย่าง

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราต้องเพิ่มค่าปรับสำหรับการละเมิดทั้งสองครั้งเข้าไปในฟิลด์เดียวกัน เนื่องจากผู้ขับขี่บางคนอาจไม่มีการละเมิดครั้งที่สอง เราจำเป็นต้องใช้ฟังก์ชัน Zero Null `ZN` เพื่อเปลี่ยน null ทั้งหมดสำหรับ**จำนวนเงินค่าปรับครั้งที่สอง**กลับเป็นศูนย์ หากไม่ทำเช่นนี้จะทำให้เป็น null หากไม่มีค่าปรับครั้งที่สอง
2. การคำนวณ:
    
    **จำนวนเงินที่จ่ายทั้งหมด** = `[1st Fine Amount] + ZN([2nd Fine Amount])`
3. จากนั้นเราสามารถพล็อต**จำนวนเงินที่จ่ายทั้งหมด**กับ **ID ผู้ขับขี่** และจัดเรียงแผนภูมิแท่งได้

![แผนภูมิแท่งจำนวนเงินที่จ่ายโดย ID ผู้ขับขี่ พร้อมตัวแก้ไขการคำนวณที่แสดงสำหรับจำนวนเงินที่จ่าย](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_1desktopIII.png)

4\. มีผู้ขับขี่กี่คนที่มีการละเมิดหลายประเภท

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราต้องทำการคำนวณ `IF` ที่พิเศษขึ้นโดยเปรียบเทียบว่าประเภทการละเมิดครั้งแรกและครั้งที่สองเหมือนกันหรือไม่ หากเหมือนกัน เราต้องกำหนดค่าเป็น "1" หากไม่เหมือนกัน เราจะกำหนดค่าเป็น "2" เนื่องจากเราสนใจเฉพาะการละเมิดหลายประเภทเท่านั้น ผลลัพธ์อื่นๆ เช่น ประเภทการละเมิดวินาทีแบบ null จะถูกกำหนดค่าเป็น "1"
2. การคำนวณ:
    
    **จำนวนประเภทการละเมิด** =
    
    IF \[1st Infraction Type\]=\[2nd Infraction Type\] THEN 1 
    ELSEIF \[1st Infraction Type\]!= \[2nd Infraction Type\] THEN 2 
    ELSE 1 END
3. จากนั้นเราสามารถพล็อต**จำนวนประเภทการละเมิด** กับ **ID ผู้ขับขี่** และจัดเรียงแผนภูมิแท่งได้

![แผนภูมิแท่งของจำนวนประเภทการละเมิดโดย ID ผู้ขับขี่ พร้อมตัวแก้ไขการคำนวณที่แสดงสำหรับจำนวนประเภทการละเมิด](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_1desktopIV.png)

5\. จำนวนเงินค่าปรับโดยเฉลี่ยสำหรับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถคือเท่าใด

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราไม่สามารถแบ่งจำนวนเงินค่าปรับทั้งหมดเป็นสองส่วนได้ เนื่องจากผู้ขับขี่บางคนมีการละเมิดเพียงครั้งเดียวเท่านั้น เรายังไม่สามารถคำนวณค่าปรับโดยเฉลี่ยต่อผู้ขับขี่หนึ่งราย และหาค่าเฉลี่ยของค่าเหล่านั้นได้ เนื่องจากค่าเฉลี่ยโดยเฉลี่ยอาจทำให้เกิดความไม่สอดคล้องกันได้ แต่เราจำเป็นต้องคำนวณจำนวนเงินที่จ่ายทั้งหมดโดยผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ แล้วหารด้วยจำนวนการละเมิดทั้งหมดที่เกี่ยวข้องกับค่าปรับเหล่านั้น
    
    1. อันดับแรก เราจำเป็นต้องระบุว่าผู้ขับขี่แต่ละคนมีการละเมิดครั้งที่สองหรือไม่ เราสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อมูลในฟิลด์ที่ "2" ทั้งหมดจะเป็น null หากไม่มีการละเมิดครั้งที่สอง และเริ่มสร้างการคำนวณ:
        
        `IFNULL([2nd Infraction Type], 'no')`
        
        การดำเนินการนี้จะส่งคืนประเภทการละเมิดหากมีอยู่ หรือ "ไม่" หากไม่มีการละเมิดครั้งที่สอง
    2. ถัดไป เราต้องแปลงข้อมูลนี้เป็นจำนวนการละเมิด 1 หรือ 2 หากผลลัพธ์ของการคำนวณ `IFNULL` ของเราคือ "ไม่" ผู้ขับขี่ควรจะถูกทำเครื่องหมายว่ามีค่าปรับหนึ่งค่า ผลลัพธ์อื่นใดควรจะถูกทำเครื่องหมายว่ามีค่าปรับสองค่า การคำนวณ:
        
        **จำนวนการละเมิด** =
        
        IF IFNULL(\[2nd Infraction Type\], 'no') = 'no' THEN 1 
        ELSE 2 
        END
    3. ตอนนี้เราต้องพิจารณาจำนวนเงินค่าปรับทั้งหมด เช่นเดียวกับคำถามที่ 3 ข้างต้น เราจะเพิ่มจำนวนเงินค่าปรับครั้งแรกและครั้งที่สองด้วยฟังก์ชัน `ZN` ประมาณวินาที อย่างไรก็ตาม เนื่องจากเราต้องการคำนวณค่านี้ที่ระดับของชุดข้อมูลทั้งหมด วิธีที่ดีที่สุดคือระบุการรวม SUM ในการคำนวณนั้นเอง การคำนวณ: 
        
        `SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) )`
    4. หากต้องการนำทั้งหมดมารวมกัน เราจะนำจำนวนเงินค่าปรับทั้งหมดนี้มาหารด้วยฟิลด์ที่คำนวณ**จำนวนการละเมิด**ใหม่ของเรา เพื่อหาจำนวนเงินค่าปรับโดยเฉลี่ย ดังนี้
        
        **ค่าปรับโดยเฉลี่ย** = `( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])`
2. เรายังต้องกรองผู้ขับขี่ที่เคยเข้าเรียนในโรงเรียนสอนขับรถ แต่ข้อมูลนั้นก็ยังเก็บไว้ในสองฟิลด์
    
    1. Tableau คำนวณเชิงตัวเลขได้มีประสิทธิภาพมาก เราจะอธิบายด้วยตัวเลขเพื่อช่วยในด้านประสิทธิภาพให้มากที่สุด เพื่อที่จะรวมสองฟิลด์นี้เข้าด้วยกัน เราจะสร้างการคำนวณสำหรับแต่ละฟิลด์ซึ่ง "ใช่ = 1" และ "ไม่ = 0" (null ก็ควร = 0 สำหรับผู้ขับขี่ที่ไม่มีการละเมิดครั้งที่สอง) จากการรวมผลลัพธ์การคำนวณนี้ ผู้ขับขี่คนใดที่มีค่ารวมเป็น 0 ไม่เคยไปโรงเรียนสอนขับรถ (และค่า 1 หรือ 2 แทนจำนวนครั้งที่ผู้ขับขี่ไป) จากนั้นเราสามารถกรองเพื่อเก็บเฉพาะผู้ขับขี่ที่มีค่าเป็น 0
    2. ครั้งนี้เราจะใช้คำสั่ง `CASE` แทน `IF` ทั้งสองคำสั่งฟังก์ชันคล้ายคลึงกันมากแต่มีวากยสัมพันธ์ต่างกัน การเริ่มต้นการคำนวณควรมีลักษณะดังนี้
        
        CASE \[1st Traffic School\]
        WHEN 'Yes' THEN 1
        WHEN 'No' THEN 
        ELSE 0
        END
    3. จากนั้นเราจะทำเช่นเดียวกันกับโรงเรียนสอนขับรถแห่งที่ 2 เราสามารถเพิ่มทั้งสองส่วนในการคำนวณเดียวกันโดยใส่วงเล็บให้คำสั่งกรณีแต่ละคำสั่งและเพิ่มเครื่องหมายบวกระหว่างสองคำสั่ง การนำตัวแบ่งบรรทัดออกบางส่วนจะมีลักษณะดังนี้
        
        **จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** =
        
        (CASE \[1st Traffic School\] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
        +
        (CASE \[2nd Traffic School\] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
    4. หากเราลาก**จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** ไปยังพื้นที่มิติของแผงข้อมูล (เหนือบรรทัดนั้น) ค่า 0–2 จะแยกกัน
    5. ตอนนี้ หากเราจะกรอง**จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** เราสามารถเลือกเพียง 0 และรู้ว่าเราจะได้รับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ
3. เพื่อตอบคำถามเดิม เราจะป้อน**ค่าปรับโดยเฉลี่ย**ไปยังแถบ ข้อความบนการ์ดเครื่องหมาย
    
    เพราะเราสร้างการรวมไปในการคำนวณ การรวมบนข้อมูลที่แสดงจะเป็น AGG และเราไม่สามารถเปลี่ยนแปลงได้ ซึ่งเป็นไปตามคาด

![มุมมองตัวเลขเดี่ยวของจำนวนเฉลี่ยที่จ่ายโดยเปิดตัวแก้ไขการคำนวณเพื่อแสดงจำนวนการเข้าเรียนโรงเรียนสอนขับรถ](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_1desktopV.png)

## ก้าวไปอีกขั้น ข้อมูลแบบมี Pivot

ขณะที่ข้อมูลที่เรากำลังทำงานอยู่มีการทำโครงสร้างที่ดีเพื่อตอบคำถามโดยเฉพาะเกี่ยวกับการละเมิดครั้งแรกและครั้งที่สอง แต่ก็ไม่ใช่โครงสร้างมาตรฐานที่แนะนำสำหรับใช้กับ Tableau Desktop ยิ่งการวิเคราะห์ของเราแตกต่างจากคำถามพื้นฐานเกี่ยวกับวันที่ละเมิดมากเท่าใด การคำนวณของเราก็ยิ่งซับซ้อนมากขึ้นในการรวมข้อมูลที่เกี่ยวข้องลงในแบบฟอร์มที่ใช้งานได้

โดยปกติ เมื่อข้อมูลถูกจัดเก็บไว้หลายคอลัมน์สำหรับข้อมูลประเภทเดียวกัน (เช่น สองคอลัมน์สำหรับวันที่ สองคอลัมน์สำหรับจำนวนเงินค่าปรับ ฯลฯ) และข้อมูลเฉพาะถูกเก็บไว้ในชื่อฟิลด์ (เช่น ไม่ว่าจะเป็นการละเมิดครั้งแรกและครั้งที่สอง) นี่เป็นข้อบ่งชี้ว่าคุณควรต้องทำ Pivot ข้อมูล

การทำ Pivot หลายครั้งใน Tableau Prep Builder สามารถจัดการปัญหานี้ได้อย่างดี เราสามารถทำงานจากจุดสิ้นสุดของลำดับงาน**การละเมิดของผู้ขับขี่** ของ Tableau Prep ที่สร้างขึ้นในบทแนะนำก่อนหน้า [การค้นหาวันที่ที่สองด้วย Tableau Prep](https://help.tableau.com/current/prep/th-th/prep_tutorial_2nddateA.htm)

> [!TIP]
> 
> **เคล็ดลับ**: ทำให้แน่ใจว่าคุณกลับมาใน Tableau Prep สำหรับขั้นตอนต่อไปนี้

1. สำหรับขั้นตอนล้างสุดท้าย ให้เพิ่มขั้นตอนทำ Pivot ซึ่งทำ Pivot ด้วยฟิลด์ที่ทำซ้ำทุกๆ ฟิลด์ ใช้ไอคอนบวก ![ปุ่มที่มีเครื่องหมายบวก](/tableau/current/th-th/prep/th-th/Img/prep_addicon.png) ตรงมุมขวาบนของพื้นที่ฟิลด์แบบมี Pivot เพื่อเพิ่ม ค่าแบบมี Pivotอีก ฟิลด์แต่ละชุด (เช่น จำนวนเงินค่าปรับครั้งที่ 1 และครั้งที่ 2) ควรทำ Pivot เข้าด้วยกัน
    
    หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการทำ Pivot โปรดดู [ล้างและปรับแต่งข้อมูล](https://help.tableau.com/current/prep/th-th/prep_clean.htm#Pivot)
2. ในพื้นที่ฟิลด์แบบมี Pivot ในส่วนคอลัมน์ชื่อของ Pivot1 ให้ดับเบิลคลิกแต่ละค่าและเปลี่ยนชื่อเป็นครั้งที่ 1 และครั้งที่ 2
    
    ![แผงการกำหนดค่า Pivot 1 ใน Tableau Prep แสดง Pivot 5 ค่า](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_2desktop.png)

คุณสามารถทำให้ผลลัพธ์เป็นระเบียบด้วยการลบวันที่ที่เป็นค่า Null รวมทั้งฟิลด์ที่เปลี่ยนชื่อใหม่และจัดลำดับใหม่

1. เพิ่มขั้นตอนการล้างหลังจากทำ Pivot ในคอลัมน์**วันที่ละเมิด** คลิกขวาที่แถบ null และเลือกไม่รวม
2. ดับเบิลคลิกชื่อฟิลด์**ชื่อของ Pivot1** และเปลี่ยนชื่อเป็น**จำนวนการละเมิด**
3. ลากฟิลด์ตามที่เหมาะสมเพื่อจัดลำดับใหม่ตามดังนี้
    
    ![ดูตัวอย่างของข้อมูลแบบมี Pivot และล้างข้อมูล](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_2desktopdata.png)

1. จากข้อมูลแบบมี Pivot ใหม่ ให้สร้างเอาต์พุตชื่อว่า **การละเมิดของผู้ขับขี่แบบมี Pivot** และป้อนไปยัง Tableau Desktop (โปรดอย่าลืมเรียกใช้ลำดับงานหลังจากเพิ่มขั้นตอนเอาต์พุต )

ตอนนี้เราสามารถดูคำถาม 5 ข้อของเราอีกครั้งด้วยโครงสร้างข้อมูลแบบมี Pivot นี้ คุณสามารถขยายแต่ละโครงสร้างเพื่อดูข้อมูลพื้นฐานเกี่ยวกับวิธีดำเนินการหากคุณติดขัด

**หมายเหตุ**: คุณสามารถดาวน์โหลดไฟล์ลำดับงานที่เสร็จสมบูรณ์ [Pivoted Driver Infractions.tflx](https://mkt.tableau.com/th-th/PrepTutorials/Pivoted%20Driver%20Infractions.tflx) เพื่อตรวจสอบงานของคุณหรือ ดาวน์โหลดเวิร์กบุ๊ก [Pivoted Driver Infractions.twbx](https://mkt.tableau.com/th-th/PrepTutorials/Pivoted%20Driver%20Infractions.twbx) เพื่อดูโซลูชันในบริบท โปรดจำไว้ว่าอาจมีวิธีอื่นในการตีความการวิเคราะห์หรือหาคำตอบ

1\. ระยะเวลาเป็นจำนวนวันระหว่างการละเมิดครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่แต่ละคนคือกี่วัน

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เช่นเดียวกับที่เราทำกับชุดข้อมูลแรก เราจะใช้ฟังก์ชัน `DATEDIFF` ฟังก์ชันนี้ต้องมีวันที่เริ่มต้นและวันที่สิ้นสุด ข้อมูลนี้มีอยู่ในข้อมูลของเรา แต่ทั้งหมดจะอยู่ในฟิลด์เดียว เราจำเป็นต้องดึงออกมาเป็นสองฟิลด์
    
    1. สร้างฟิลด์การคำนวณเบื้องต้นสองฟิลด์
        
        **วันที่ละเมิดครั้งที่ 1** = `IF [Infraction Number] = "1st" THEN [Infraction Date] END`
        
        **วันที่ละเมิดครั้งที่ 2** = `IF [Infraction Number] = "2nd" THEN [Infraction Date] END`
    2. เนื่องจากเราต้องการให้แน่ใจว่าค่าทั้งสองนี้สามารถใช้เปรียบเทียบผู้ขับขี่แต่ละคนได้ เราจึงต้องแก้ไขให้อยู่ในระดับ **ID ผู้ขับขี่**
        
        **หมายเหตุ**: ไม่เชื่อหรือ ลองทำการคำนวณ `DATEDIFF` ด้วยสองฟิลด์นี้ตามที่เป็นอยู่: **เวลาระหว่างการละเมิด =** \= `DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])`  
        คุณจะได้ผลลัพธ์เป็น null ทุกที่ เพราะ Tableau พยายามเปรียบเทียบกับทั่วทุกโครงสร้างข้อมูลที่มีลักษณะเช่นนี้  
        ![ตารางข้อความแสดงผลลัพธ์เป็น null](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_2desktopnulls.png)  
        นี่คือ แถวซึ่งรู้ว่าวันที่แรกคืออะไรจะไม่รู้ว่าวันที่ที่สองคืออะไร และในทางกลับกัน เพื่อหลีกเลี่ยงปัญหานี้ เราจะใช้นิพจน์ระดับรายละเอียด FIXED เพื่อบังคับวันที่แรกและวันที่ที่สองเหล่านี้ให้สัมพันธ์กันโดย **ID ผู้ขับขี่**
    
    แก้ไขการคำนวณแต่ละครั้งดังนี้
    
    **วันที่ละเมิดครั้งที่ 1** = `{ FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Infraction Date] END ) }`
    
    **วันที่ละเมิดครั้งที่ 2** = `{ FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Infraction Date] END ) }`
    
    **หมายเหตุ**: การคำนวณ `IF` เดิมต้องรวมเมื่อฝังอยู่ในนิพจน์ LOD เราสามารถใช้การรวมพื้นฐานใดๆ ที่จะคงค่าวันที่ไว้ (ดังเช่นการรวมแบบ SUM, AVG หรือ MIN แต่ไม่ใช่ CNT หรือ CNTD)
    
    **หมายเหตุ**: การคำนวณเหล่านี้ยังสามารถสร้างใน Tableau Prep Builder ได้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับนิพจน์ LOD ใน Prep โปรดดู [สร้างระดับของรายละเอียด อันดับ และการคำนวณไทล์](https://help.tableau.com/current/prep/th-th/prep_calculations.htm)
    
    8. ตอนนี้เราสามารถสร้างการคำนวณ `DATEDIFF` ได้ดังนี้
        
        **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])`
        
        - หากเราต้องการดูสัปดาห์หรือเดือน เพียงแค่แก้ไขส่วนวันที่ (ปัจจุบันคือ `'day'`)
        - นอกจากนี้ยังเป็นไปได้ที่จะสร้างการคำนวณเดี่ยวสำหรับทั้งหมดโดยการวางการคำนวณแบบ FIXED ใน DATEDIFF โดยตรงดังนี้ 
            
            DATEDIFF ( 'day', 
            
            { FIXED \[Driver ID\] : MIN ( IF \[Infraction Number\] = "1st" THEN \[Infraction Date\] END ) },
            
            { FIXED \[Driver ID\] : MIN ( IF \[Infraction Number\] = "2nd" THEN \[Infraction Date\] END ) }
            
            )
    9. พล็อต**เวลาระหว่างการละเมิด**บนคอลัมน์ และ**ID ผู้ขับขี่**บนแถว

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลแบบไม่มี Pivot

2\. เปรียบเทียบจำนวนเงินค่าปรับสำหรับการละเมิดครั้งแรกและครั้งที่สอง มีความสัมพันธ์กันหรือไม่

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราจะใช้ลอจิกที่คล้ายคลึงกับคำถามก่อนหน้า เราจะใช้**จำนวนการละเมิด**เพื่อระบุหากแถวที่กำหนดเป็นการละเมิดครั้งแรกหรือครั้งที่สอง จากนั้นดึงจำนวนเงินค่าปรับออกมาตามนั้น
    
    1. หากสิ่งที่เราต้องการทำคือทำแผนภาพการกระจาย เราสามารถข้ามส่วน LOD และใช้แค่การคำนวณ `IF` ดังนี้
        
        **จำนวนเงินค่าปรับครั้งที่ 1** = `IF [Infraction Number] = "1st" THEN [Fine Amount] END`
        
        **จำนวนเงินค่าปรับครั้งที่ 2** = `IF [Infraction Number] = "2nd" THEN [Fine Amount] END`
    2. อย่างไรก็ตาม หากเราต้องการเปรียบเทียบและดูความแตกต่างของจำนวนเงินระหว่างค่าปรับครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่คนเดียว เราจะพบปัญหาที่เป็น null เช่นเดียวกับวันที่ การใส่การคำนวณเหล่านี้ไว้ใน LOD แบบ `FIXED` ไม่ใช่เรื่องเสียหาย ดังนั้นจึงควรทำเช่นนี้ตั้งแต่ต้น ดังนี้
        
        **จำนวนเงินค่าปรับครั้งที่ 1** = `{ FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }`
        
        **จำนวนเงินค่าปรับครั้งที่ 2** = `{ FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Fine Amount] END ) }`
        
        การคำนวณเหล่านี้ยังสามารถสร้างใน Tableau Prep Builder ได้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับนิพจน์ LOD ใน Prep โปรดดู [สร้างระดับของรายละเอียด อันดับ และการคำนวณไทล์](https://help.tableau.com/current/prep/th-th/prep_calculations.htm)
    3. สร้างแผนภาพการกระจายโดย**จำนวนเงินค่าปรับครั้งที่ 1** บนคอลัมน์และ**จำนวนเงินค่าปรับครั้งที่ 2**บนแถว และนำเส้นแนวโน้มแนวนอนออกมาดังเดิม

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลแบบไม่มี Pivot

3\. ผู้ขับขี่รายใดจ่ายโดยรวมมากที่สุด ใครจ่ายน้อยที่สุด

1. เพื่อตอบคำถามนี้ใน Tableau Desktop โครงสร้างข้อมูลแบบมี Pivot ถือว่าเหมาะสมที่สุด สิ่งที่เราต้องทำคือนำ **ID ผู้ขับขี่**และ**จำนวนเงินค่าปรับ**มาไว้ในแผนภูมิแท่ง การรวมตามค่าเริ่มต้นเป็น SUM อยู่แล้ว ดังนั้นจำนวนเงินที่จ่ายทั้งหมดจากผู้ขับขี่จะพล็อตโดยอัตโนมัติ

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลแบบไม่มี Pivot

4\. มีผู้ขับขี่กี่คนที่มีการละเมิดหลายประเภท

1. เพื่อตอบคำถามนี้ใน Tableau Desktop โครงสร้างข้อมูลแบบมี Pivot ถือว่าเหมาะสมที่สุด สิ่งที่เราต้องทำคือนำ **ID ผู้ขับขี่**และนับจำนวนที่แตกต่างกันของ**ประเภทการละเมิด** ออกมาเป็นแผนภูมิแท่ง และเราจะได้คำตอบ

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลแบบไม่มี Pivot

5\. จำนวนเงินค่าปรับโดยเฉลี่ยสำหรับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถคือเท่าใด

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราไม่สามารถแบ่งจำนวนเงินค่าปรับทั้งหมดเป็นสองส่วนได้ เนื่องจากผู้ขับขี่บางคนมีการละเมิดเพียงครั้งเดียวเท่านั้น เรายังไม่สามารถคำนวณค่าปรับโดยเฉลี่ยต่อผู้ขับขี่หนึ่งราย และหาค่าเฉลี่ยของค่าเหล่านั้นได้ เนื่องจากค่าเฉลี่ยโดยเฉลี่ยอาจทำให้เกิดความไม่สอดคล้องกันได้ แต่เราจำเป็นต้องคำนวณจำนวนเงินที่จ่ายทั้งหมดโดยผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ แล้วหารด้วยจำนวนการละเมิดทั้งหมดที่เกี่ยวข้องกับค่าปรับเหล่านั้น
    
    1. อันดับแรก เราจำเป็นต้องระบุว่าผู้ขับขี่แต่ละคนมีการละเมิดครั้งที่สองหรือไม่ เราสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่า**วันที่การละเมิดครั้งที่ 2** จะเป็น null หากไม่มีการละเมิดครั้งที่สอง และเริ่มสร้างการคำนวณดังนี้
        
        `IFNULL(STR([2nd Infraction Date]), 'no')`
        
        การดำเนินการนี้จะส่งคืนวันที่การละเมิดครั้งที่สองหากมีอยู่ หรือ "ไม่" หากไม่มีการละเมิดครั้งที่สอง
        
        **หมายเหตุ**: ส่วน `STR` ของการคำนวณนี้จำเป็นเพราะ `IFNULL` จำเป็นต้องมีประเภทข้อมูลที่สม่ำเสมอในการอภิปราย เพราะเราต้องการคืนสตริง "ไม่” สำหรับค่า null เราจำเป็นต้องแปลงวันที่เป็นสตริงด้วย
    2. ถัดไป เราต้องแปลงข้อมูลนี้เป็นจำนวนการละเมิด 1 หรือ 2 หากผลลัพธ์ของการคำนวณ `IFNULL` ของเราคือ "ไม่" ผู้ขับขี่ควรจะถูกทำเครื่องหมายว่ามีค่าปรับหนึ่งค่า ผลลัพธ์อื่นใดควรจะถูกทำเครื่องหมายว่ามีค่าปรับสองค่า การคำนวณ:
        
        **จำนวนการละเมิด** =
        
        IF IFNULL(STR(\[2nd Infraction Date\]), 'no')= 'no' THEN 1 
        ELSE 2 
        END
    3. ตอนนี้เราจำเป็นต้องพิจารณาจำนวนค่าปรับโดยเฉลี่ย เรามีฟิลด์เดี่ยวสำหรับ**จำนวนค่าปรับ**แล้ว สิ่งที่เราต้องทำคือแยกด้วยฟิลด์**จำนวนการละเมิด** ใหม่ ใส่ทั้งสองค่าใน SUM ดังนี้ 
        
        **ค่าปรับโดยเฉลี่ย** = `(SUM([Fine Amount]) / SUM([Number of Infractions])`
2. เราจำเป็นต้องกรองผู้ขับขี่ที่เข้าเรียนในโรงเรียนสอนขับรถออกด้วย ดูเหมือนว่าเราจะสามารถใช้ฟิลด์**โรงเรียนการจราจร** และกรอง**โรงเรียนการจราจร = ไม่** ได้ อย่างไรก็ตาม การทำเช่นนี้จะเป็นการกรอง_การละเมิด_ที่ไม่เกี่ยวข้องกับโรงเรียนการจราจร ไม่ใช่_ผู้ขับขี่_ที่ไม่เคยไปยังโรงเรียนการจราจร หากผู้ขับขี่เข้าเรียนในโรงเรียนสอนขับรถด้วยการละเมิดอย่างหนึ่งไม่ใช่การละเมิดอีกอย่าง เราไม่ต้องการให้พิจารณาการละเมิดอย่างใดอย่างหนึ่งในที่นี้ ซึ่งผู้ขับขี่คนนั้นเคยไปโรงเรียนสอนขับรถ ดังนั้นจึงไม่เหมาะกับตัววัดของคำถาม
    
    สิ่งที่เราต้องทำคือกรองผู้ขับขี่ที่เคยเข้าเรียนในโรงเรียนสอนขับรถออก ในแง่ของข้อมูล เราต้องการกรองผู้ขับขี่ที่มี "ใช่" สำหรับ**โรงเรียนสอนขับรถ** ออกจากทุกแถว ไม่ว่าจะเกี่ยวข้องกับการละเมิดแบบใด มาสร้างการคำนวณของเราเป็นขั้นๆ โดยใช้มุมมองง่ายๆ เพื่อช่วยติดตามสิ่งที่เกิดขึ้นดังนี้
    
    1. ขั้นแรก เราต้องรู้ว่าผู้ขับขี่มี "ใช่" สำหรับโรงเรียนสอนขับรถหรือไม่ ลาก **ID ผู้ขับขี่**ไปยังแถว และ**โรงเรียนสอนขับรถ**ไปยังคอลัมน์ เราจะได้ตารางข้อความที่มีข้อความ "Abc" ของตัวยึดตำแหน่งซึ่งระบุค่าที่เกี่ยวข้องสำหรับผู้ขับขี่แต่ละคน
    2. ขั้นตอนต่อไป เราต้องการสร้างการคำนวณที่จะระบุหากค่าของ**โรงเรียนสอนขับรถ**เป็น "ใช่" ขั้นตอนแรกของการคำนวณคือ
        
        **ที่เข้าเรียนในโรงเรียนสอนขับรถ** \= `CONTAINS([Traffic School), 'Yes')`
        
        หากเรานำ**ที่เข้าเรียนในโรงเรียนสอนขับรถ**ไปยังแถบสีบนการ์ดเครื่องหมาย เราจะเห็นค่านั้นติดป้ายกำกับว่า "เท็จ" สำหรับทุกเครื่องหมายในคอลัมน์ "ไม่" และ "จริง" สำหรับทุกเครื่องหมายในคอลัมน์ "ใช่"
        
        ![การแสดงพร้อมป้ายกำกับ "เท็จ" สำหรับทุกเครื่องหมายในคอลัมน์ "ไม่ใช่" และป้ายกำกับ "จริง" สำหรับทุกเครื่องหมายในคอลัมน์ "ใช่"](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_pivotedV2.png "มุมมองของ ID ผู้ขับขี่ตามโรงเรียนสอนขับรถ ที่มีการเข้าเรียนในโรงเรียนสอนขับรถเป็นสี")
    3. อย่างไรก็ตาม สิ่งที่เราต้องการจริงๆ คือข้อมูลนี้ในระดับ_ผู้ขับขี่_ ไม่ใช่_การละเมิด_ นิพจน์ LOD เหมาะสมอยู่แล้วเมื่อพยายามคำนวณผลลัพธ์ในระดับรายละเอียดที่แตกต่างจากโครงสร้างพื้นฐานของข้อมูล เราจะทำให้นิพจน์นี้เป็นนิพจน์ LOD แบบ `FIXED` แต่ตามที่รู้กัน ส่วนนิพจน์รวมของ LOD จะต้องรวมไว้ ก่อนหน้านี้ เราเคยใช้ MIN จะใช้ที่นี่ได้ด้วยไหม เราจะแก้ไขการคำนวณเป็น: 
        
        **ที่เข้าเรียนในโรงเรียนสอนขับรถ** \= `{ FIXED [Driver ID] : MIN( CONTAINS([Traffic School], 'Yes'))}`
        
        ![มุมมองของ ID ผู้ขับขี่ตามโรงเรียนสอนขับรถ ที่มีการเข้าเรียนในโรงเรียนสอนขับรถเป็นสี](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_pivotedV3.png)
        
        ด้วยการเปลี่ยนแปลงดังกล่าวในมุมมอง เราจะเห็นสิ่งที่ตรงกันข้ามกับสิ่งที่เราต้องการ ผู้ขับขี่ที่มีคำว่า "ไม่" จะถูกทำเครื่องหมายเป็น "เท็จ" ทั่วทั้งบอร์ด แต่เราต้องการให้ "ใช่" เป็น "จริง" ในทุกบันทึกสำหรับผู้ขับขี่คนนั้น MIN มีหน้าที่อะไรที่นี่ MIN จะเลือกคำตอบแรกตามลำดับตัวอักษรที่เป็น "ไม่"
    4. หากเราเปลี่ยนเป็น MAX ล่ะ MAX จะใช้คำตอบสุดท้ายตามลำดับตัวอักษรหรือไม่ เราจะแก้ไขการคำนวณเป็น: 
        
        **ที่เข้าเรียนในโรงเรียนสอนขับรถ** \= `{ FIXED [Driver ID] : MAX ( CONTAINS( [Traffic School], 'Yes') ) }`
        
        ![มุมมองของ ID ผู้ขับขี่ตามโรงเรียนสอนขับรถ ที่มีการเข้าเรียนในโรงเรียนสอนขับรถเป็นสี](/tableau/current/th-th/prep/th-th/Img/prep_tutorial_2d_pivotedV4.png)
        
        และนี่คือสิ่งที่เราได้ หากคนขับมี "ใช่" ที่ใดก็ได้ในข้อมูล พวกเขาจะถูกทำเครื่องหมายว่า "จริง" เนื่องจากเคยเข้าเรียนในโรงเรียนสอนขับรถ แม้แต่ในการละเมิดที่ไม่เกี่ยวกับโรงเรียนสอนขับรถ
    5. หากเรานำ**ที่เข้าเรียนในโรงเรียนสอนขับรถ**ไปยังแถบตัวกรอง และเลือกเฉพาะ "เท็จ” เราจะเหลือแค่ผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ
3. เพื่อที่จะตอบคำถามเดิม ด้วยตัวกรองของเราที่มีอยู่ เราจะแค่นำ**ค่าปรับโดยเฉลี่ย**ไปยังแถบข้อความบนการ์ดเครื่องหมาย เนื่องจากเราสร้างการรวมลงในการคำนวณ การรวมบนฟิลด์จะเป็น AGG และเราไม่สามารถเปลี่ยนแปลงได้ ซึ่งเป็นไปตามคาด

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลแบบไม่มี Pivot

### ประโยชน์ของข้อมูลแบบมี Pivot

หากเรารู้ว่าเราแค่ต้องใช้โครงสร้างนั้นตอบคำถามที่ตอบได้ง่ายเท่านั้น เราอาจยึดติดกับโครงสร้างข้อมูลเดิมจากบทแนะนำได้ อย่างไรก็ตาม ข้อมูลแบบมี Pivot นั้นยืดหยุ่นกว่า ถึงแม้ว่าจะต้องมีการคำนวณบ้าง แต่เมื่อเข้าที่แล้ว ชุดข้อมูลที่เป็นผลลัพธ์ก็เหมาะที่จะตอบคำถามที่กว้างขึ้น

## ก้าวไปอีกขั้น การคำนวณเท่านั้น

หากคุณเข้าถึง Tableau Prep Builder ไม่ได้ล่ะ คุณโชคร้ายไปตลอดเลยหรือไม่หากคุณติดอยู่กับข้อมูลเดิม ไม่เลย

Tableau Desktop และนิพจน์ LOD สามารถตอบคำถามเชิงวิเคราะห์ของเราทั้งหมดได้ หากเราเชื่อมต่อไปยัง [**Traffic Violations.xlsx**](https://mkt.tableau.com/PrepTutorials/Traffic%20Violations.xlsx) เดิม จะดูคล้ายคลึงกับชุดข้อมูลแบบมี Pivot มาก เพียงแค่ไม่มีฟิลด์**จำนวนการละเมิด**สำคัญ เราจะต้องเลียนแบบผลลัพธ์ของขั้นตอนการรวมผ่านนิพจน์ LOD

**หมายเหตุ**: คุณสามารถดาวน์โหลดเวิร์กบุ๊ก [LOD Driver Infractions.twbx](https://mkt.tableau.com/th-th/PrepTutorials/LOD%20Driver%20Infractions.twbx) เพื่อดูโซลูชันในบริบท โปรดจำไว้ว่าอาจมีวิธีอื่นในการตีความการวิเคราะห์หรือหาคำตอบ

1\. ระยะเวลาเป็นจำนวนวันระหว่างการละเมิดครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่แต่ละคนคือกี่วัน

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราจะใช้ฟังก์ชัน `DATEDIFF` อีกครั้ง ฟังก์ชันนี้ต้องมีวันที่เริ่มต้นและวันที่สิ้นสุด ข้อมูลนี้มีอยู่ในข้อมูลของเรา แต่ทั้งหมดจะอยู่ในฟิลด์เดียว เราจำเป็นต้องดึงออกมาเป็นสองฟิลด์ เนื่องจากเราต้องการให้แน่ใจว่าค่าทั้งสองนี้สามารถใช้เปรียบเทียบผู้ขับขี่แต่ละคนได้ เราจึงต้องแก้ไขให้อยู่ในระดับ **ID ผู้ขับขี่**
    
    1. เพื่อที่จะหาวันที่การละเมิดครั้งแรก เราจะใช้การคำนวณนี้
        
        **การละเมิดครั้งที่ 1** = `{ FIXED [Driver ID] : MIN ( [Infraction Date] ) }`
    2. เราจะทำวันที่ละเมิดครั้งที่สองตามขั้นตอน
        
        1. ในการเริ่มต้น เราต้องดูเฉพาะวันที่ที่มากกว่าวันแรก
            
            `IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END`
        2. แต่วิธีนี้จะให้การละเมิด_ทุกครั้ง_หลังจากวันแรก แต่เราต้องการแค่วันที่สอง ดังนั้นเราต้องการวันที่ที่จำนวนน้อยที่สุดในวันที่เหล่านี้ ใส่วันที่ทั้งหมดใน MIN ดังนี้
            
            `MIN( IF [Infraction] : [1st Infraction] THEN [Infraction Date] END )`
        3. นอกจากนี้เรายังต้องการคำนวณวันที่การละเมิดครั้งที่สองสำหรับผู้ขับขี่แต่ละคน นิพจน์ LOD จะเข้ามาเกี่ยวข้องในขั้นนี้ เราจะแก้ไขค่านี้เป็นระดับ **ID ผู้ขับขี่**ดังนี้
            
            **การละเมิดครั้งที่ 2** = `{ FIXED [Driver ID] : MIN ( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }`
    3. และตอนนี้เราสามารถสร้างการคำนวณ `DATEDIFF` ดังนี้
        
        **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction], [2nd Infraction])`

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลอีกสองโครงสร้าง

2\. เปรียบเทียบจำนวนเงินค่าปรับสำหรับการละเมิดครั้งแรกและครั้งที่สอง มีความสัมพันธ์กันหรือไม่

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราจะใช้ลอจิกที่คล้ายคลึงกับเวอร์ชันข้อมูลแบบมี Pivot ของคำถามนี้ เราจะใช้ฟิลด์**การละเมิดครั้งที่ 1**และ**การละเมิดครั้งที่ 2** ที่เราสร้างสำหรับคำถามที่ 1 เพื่อระบุว่าแถวที่กำหนดเป็นการละเมิดครั้งแรกหรือครั้งที่สอง จากนั้นดึงจำนวนเงินค่าปรับออกมาตามนั้น
    
    1. หากสิ่งเดียวที่เราต้องการทำคือทำแผนภาพการกระจาย เราสามารถข้ามส่วน LOD และใช้แค่การคำนวณ `IF` ดังนี้
        
        **จำนวนเงินค่าปรับครั้งที่ 1** = `IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END`
        
        **จำนวนเงินค่าปรับครั้งที่ 2** = `IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END`
    2. อย่างไรก็ตาม หากเราต้องการเปรียบเทียบและดูความแตกต่างของจำนวนเงินระหว่างค่าปรับครั้งแรกและครั้งที่สองสำหรับผู้ขับขี่คนเดียว เราจะพบปัญหาเกี่ยวกับ null เช่นเดียวกับในโครงสร้างข้อมูลแรก การใส่การคำนวณเหล่านี้ไว้ใน LOD แบบ FIXED ไม่ใช่เรื่องเสียหาย ดังนั้นจึงควรทำเช่นนี้ตั้งแต่ต้น ดังนี้
        
        **จำนวนเงินค่าปรับครั้งที่ 1** = ``{ FIXED [Driver ID] : MIN ( `IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END` ) }``
        
        **จำนวนเงินค่าปรับครั้งที่ 2** = ``{FIXED [Driver ID] : MIN( `IF [2ndInfraction] = [Infraction Date] THEN [Fine Amount] END` ) }``

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลอีกสองโครงสร้าง

3\. ผู้ขับขี่รายใดจ่ายโดยรวมมากที่สุด ใครจ่ายน้อยที่สุด

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราต้องเข้าใจบางอย่างเกี่ยวกับวิธีการใช้ LOD เท่านั้นก่อน ทั้งสองวิธีใช้ Tableau Prep กรองบันทึกที่ไม่ใช่การละเมิดครั้งแรกหรือครั้งที่สองสำหรับผู้ขับขี่ วิธี LOD ใน Tableau Desktop จะเก็บบันทึกทั้งหมด หมายความว่าหากเราสร้างการแสดงเป็นภาพ **SUM(จำนวนเงินที่จ่าย)**โดย **ID ผู้ขับขี่** เวอร์ชัน Tableau Desktop เท่านั้นจะแสดงจำนวนของผู้ขับขี่ที่มีการละเมิดมากกว่าสองครั้งมากขึ้น หากต้องการได้ค่า**จำนวนเงินที่จ่ายทั้งหมด**จากข้อมูลสมบูรณ์ที่จับคู่กับวิธีอื่นๆ แทนที่จะใช้ฟิลด์**จำนวนเงินค่าปรับ** เราต้องรวมค่าปรับครั้งแรกและครั้งที่สองเหมือนที่เราทำกับโครงสร้างข้อมูลแรก
2. โดยใช้ฟิลด์ที่เราสร้างขึ้นสำหรับคำถามที่ 2 เราจะเพิ่มจำนวนเงินค่าปรับสองรายการ `ZN`  ถือว่ามีความจำเป็นเพื่อป้องกันไม่ให้ผลลัพธ์มีค่าเป็นค่า null สำหรับผู้ขับขี่ที่มีการละเมิดเพียงครั้งเดียว การคำนวณ: 
    
    **จำนวนเงินที่จ่ายทั้งหมด** = `[1st Fine Amount] + ZN([2nd Fine Amount])`

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลอีกสองโครงสร้าง

4\. มีผู้ขับขี่กี่คนที่มีการละเมิดหลายประเภท

1. เพื่อที่จะตอบคำถามนี้ใน Tableau Desktop เราไม่สามารถทำเพียงแค่นำ **ID ผู้ขับขี่**และนับจำนวนที่แตกต่างกันของ**ประเภทการละเมิด**ออกมา เนื่องจากชุดข้อมูลนี้มีการละเมิดเกินกว่าวินาที ผู้ขับขี่บางคนอาจมีการละเมิดมากกว่าสองประเภท หากต้องการจับคู่ผลลัพธ์กับวิธีอื่นๆ เราต้องจำกัดขอบเขตให้เหลือเพียงสองการละเมิดแรกเท่านั้น

1. เราสามารถดึงประเภทการละเมิดครั้งที่ 1 และครั้งที่ 2 ออกมาใส่ด้วยนิพจน์ LOD เพื่อทำให้ `FIXED` กับผู้ขับขี่คนนั้น จากนั้นใช้การคำนวณ `IF` เพื่อนับประเภท ดังนี้
    
    1. **ประเภทการละเมิดครั้งที่ 1** = `{ FIXED [Driver ID] : MIN ( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }`
    2. **ประเภทการละเมิดครั้งที่ 2** = `{ FIXED [Driver ID] : MIN ( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }`
    3. **จำนวนประเภทการละเมิด** =
        
        IF \[1st Infraction Type\] = \[2nd Infraction Type\] THEN 1 
        ELSEIF \[1st Infraction Type\] != \[2nd Infraction Type\] THEN 2
        ELSE 1 END 
        
        **หมายเหตุ**: นอกจากนี้ยังสามารถสร้างการคำนวณเหล่านี้เป็นฟิลด์เดียวได้ด้วยการซ้อนการคำนวณเริ่มต้นโดยตรงในการคำนวณที่ใหญ่ขึ้น การคำนวณแบบรวมจะมีลักษณะดังนี้  
        `IF   {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}   =   {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}   THEN 1      ELSEIF   {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}   !=   {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}   THEN 2      ELSE 1   END`  
          
        ซึ่งทำความเข้าใจได้ยากกว่าเล็กน้อย แต่ใช้งานได้หากต้องการ (โปรดทราบว่าการขึ้นบรรทัดใหม่และการเว้นวรรคบางส่วนไม่ส่งผลต่อการตีความการคำนวณโดย Tableau)
2. จากนั้นเราสามารถพล็อต**จำนวนประเภทการละเมิด** กับ **ID ผู้ขับขี่** และจัดเรียงแผนภูมิแท่งได้

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลอีกสองโครงสร้าง

5\. จำนวนเงินค่าปรับโดยเฉลี่ยสำหรับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถคือเท่าใด

1. เพื่อตอบคำถามนี้ใน Tableau Desktop เราไม่สามารถแบ่งจำนวนเงินค่าปรับทั้งหมดเป็นสองส่วนได้ เนื่องจากผู้ขับขี่บางคนมีการละเมิดเพียงครั้งเดียวเท่านั้น เรายังไม่สามารถคำนวณค่าปรับโดยเฉลี่ยต่อผู้ขับขี่หนึ่งราย และหาค่าเฉลี่ยของค่าเหล่านั้นได้ เนื่องจากค่าเฉลี่ยโดยเฉลี่ยอาจทำให้เกิดความไม่สอดคล้องกันได้ แต่เราจำเป็นต้องคำนวณจำนวนเงินที่จ่ายทั้งหมดโดยผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ แล้วหารด้วยจำนวนการละเมิดทั้งหมดที่เกี่ยวข้องกับค่าปรับเหล่านั้น
    
    1. อันดับแรก เราจำเป็นต้องระบุว่าผู้ขับขี่แต่ละคนมีการละเมิดครั้งที่สองหรือไม่ เราสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าข้อมูลในฟิลด์ที่ "2" ทั้งหมดจะเป็น null หากไม่มีการละเมิดครั้งที่สอง และเริ่มสร้างการคำนวณ:
        
        `IFNULL([2nd Infraction Type], 'no')`
        
        การดำเนินการนี้จะส่งคืนประเภทการละเมิดหากมีอยู่ หรือ "ไม่" หากไม่มีการละเมิดครั้งที่สอง
    2. ถัดไป เราต้องแปลงข้อมูลนี้เป็นจำนวนการละเมิด 1 หรือ 2 หากผลลัพธ์ของการคำนวณ `IFNULL` ของเราคือ "ไม่" ผู้ขับขี่ควรจะถูกทำเครื่องหมายว่ามีค่าปรับหนึ่งค่า ผลลัพธ์อื่นใดควรจะถูกทำเครื่องหมายว่ามีค่าปรับสองค่า การคำนวณ:
        
        **จำนวนการละเมิด** =
        
        IF IFNULL(\[2nd Infraction Type\], 'no') = 'no' THEN 1
        ELSE 2
        END
    3. สำหรับจำนวนเงินที่จ่ายทั้งหมด เราสามารถใช้การคำนวณจากคำถามที่ 3 ได้ หากต้องการนำทั้งหมดมารวมกัน เราจะนำจำนวนเงินค่าปรับทั้งหมดนี้มาหารด้วยฟิลด์ที่คำนวณ**จำนวนการละเมิด**ใหม่ของเรา เพื่อหาจำนวนเงินค่าปรับโดยเฉลี่ย ดังนี้
        
        **ค่าปรับโดยเฉลี่ย** = `SUM([Total Amount Paid]) / SUM([Number of Infractions])`
2. เราจำเป็นต้องกรองผู้ขับขี่ที่เข้าเรียนในโรงเรียนสอนขับรถออกด้วย เนื่องจากชุดข้อมูลนี้ประกอบด้วยผู้ขับขี่บางคนที่มีการละเมิดครั้งที่สามหรือสี่ เราจึงไม่สามารถใช้วิธีการเดียวกันกับโครงสร้างข้อมูล Pivot ได้ แต่เราจะใช้วิธีเดียวกันกับข้อมูลแบบไม่มี Pivot ซึ่งสรุปไว้ที่นี่ดังนี้
    
    1. อันดับแรก เราต้องสร้างการคำนวณสองแบบเพื่อระบุว่าการละเมิดครั้งแรกและครั้งที่สองเกี่ยวข้องกับโรงเรียนสอนขับรถหรือไม่ ดังนี้ 
        
        **โรงเรียนสอนขับรถครั้งที่ 1** = `{ FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }`
        
        **โรงเรียนสอนขับรถครั้งที่ 2** = `{ FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }`
    2. จากนั้นเราจะเพิ่มค่าเหล่านั้นเพื่อให้ได้จำนวนการเข้าเรียนโรงเรียนสอนขับรถทั้งหมด ดังนี้ 
        
        **จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** =
        
        (CASE \[1st Traffic School\] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
        +
        (CASE \[2nd Traffic School\] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
    3. หากเราดึง**จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** ไปยังพื้นที่มิติของแผงข้อมูล ค่า 0–2 จะแยกกัน
    4. ตอนนี้ หากเราจะกรอง**จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** เราสามารถเลือกเพียง 0 และรู้ว่าเราจะได้รับผู้ขับขี่ที่ไม่เคยเข้าเรียนในโรงเรียนสอนขับรถ
3. เพื่อตอบคำถามเดิม เราจะป้อน**ค่าปรับโดยเฉลี่ย**ไปยังแถบ ข้อความบนการ์ดเครื่องหมาย เนื่องจากเราสร้างการรวมลงในการคำนวณ การรวมบนฟิลด์จะเป็น AGG และเราไม่สามารถเปลี่ยนแปลงได้ ซึ่งเป็นไปตามคาด

ผลลัพธ์จะเหมือนกับผลลัพธ์ที่มีโครงสร้างข้อมูลอีกสองโครงสร้าง

สิ่งสำคัญคือต้องจำไว้ว่าโซลูชันนี้มีการคำนวณแบบซ้อนและนิพจน์ LOD จำนวนมาก ประสิทธิภาพอาจเป็นปัญหาได้ ทั้งนี้ขึ้นอยู่กับขนาดของชุดข้อมูลและความซับซ้อนของข้อมูล

## ไตร่ตรองเกี่ยวกับวิธีการ

แล้วควรไปเส้นทางไหน ทั้งหมดนั้นขึ้นอยู่กับคุณและเครื่องมือที่คุณมีอยู่

- หากคุณต้องการหลีกเลี่ยง LOD ก็มีโซลูชันการสร้างข้อมูล แม้ว่าการคำนวณอาจจำเป็นสำหรับการวิเคราะห์บางอย่าง ([การวิเคราะห์ใน Tableau Desktop](#Desktop))
- หากคุณสามารถกำหนดรูปแบบข้อมูลและสะดวกที่จะคำนวณ รวมถึง LOD ตัวเลือกทางสายกลางจะมอบความยืดหยุ่นมากที่สุด ([ก้าวไปอีกขั้น ข้อมูลแบบมี Pivot](#Further))
- หากคุณสะดวกใช้ LOD จะมีผลกระทบต่อประสิทธิภาพน้อยที่สุด และ/หรือคุณไม่มีสิทธิ์เข้าถึง Tableau Prep การแก้ปัญหานี้ด้วย LOD เพียงอย่างเดียวคือตัวเลือกที่ใช้การได้ ([ก้าวไปอีกขั้น การคำนวณเท่านั้น](#Furtherer))

อย่างน้อยที่สุด ควรเข้าใจว่าการรวมใน Tableau Prep และนิพจน์ระดับรายละเอียดใน Tableau Desktop มีความสัมพันธ์กันและส่งผลต่อการวิเคราะห์ข้อมูลอย่างไร เช่นเดียวกับวิธีส่วนใหญ่ใน Tableau มีวิธีทำมากกว่าหนึ่งวิธี การสำรวจตัวเลือกต่างๆ ทั้งหมดสามารถช่วยนำแนวคิดมารวมกัน และให้คุณเลือกทางออกที่ดีที่สุดสำหรับตน

การคำนวณใช้

### การละเมิดของผู้ขับขี่

- **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])`
- **จำนวนเงินที่จ่ายทั้งหมด** =`[1st Fine Amount] + ZN([2nd Fine Amount])`
- **จำนวนประเภทการละเมิด** = `IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END`
- **จำนวนการละเมิด** = `IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END`
- **ค่าปรับโดยเฉลี่ย** = `( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])`
- **จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** = `(CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)`

### การละเมิดของผู้ขับขี่แบบมี Pivot

- **การละเมิดครั้งที่ 1** = `{FIXED [Driver ID] : MIN(IF [Infraction Number] = "1st" THEN [Infraction Date] END)}`
- **การละเมิดครั้งที่ 2** = `{FIXED [Driver ID] : MIN(IF [Infraction Number] = "2nd" THEN [Infraction Date] END)}`
- **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction], [2nd Infraction])`
- **จำนวนเงินค่าปรับครั้งที่ 1** = `{FIXED [Driver ID] : MIN( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }`
- **จำนวนการละเมิด** = `IF IFNULL(STR([2nd Infraction]), 'no')= 'no' THEN 1 ELSE 2 END`
- **ค่าปรับโดยเฉลี่ย** = `SUM([Fine Amount])/SUM([Number of Infractions])`
- **ที่เข้าเรียนในโรงเรียนสอนขับรถ** \= `{ FIXED [Driver ID] : MAX( CONTAINS([Traffic School], 'Yes'))}`

### การละเมิดของผู้ขับขี่ LOD

- **การละเมิดครั้งที่ 1** = `{FIXED [Driver ID] : MIN([Infraction Date])}`
- **การละเมิดครั้งที่ 2** = `{ FIXED [Driver ID] : MIN( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }`
- **เวลาระหว่างการละเมิด** = `DATEDIFF('day', [1st Infraction], [2nd Infraction])`
- **จำนวนเงินค่าปรับครั้งที่ 1** = `{FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END ) }`
- **จำนวนเงินค่าปรับครั้งที่ 2** = `{FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END ) }`
- **จำนวนเงินที่จ่ายทั้งหมด** = `[1st Fine Amount] + ZN([2nd Fine Amount])`
- **ประเภทการละเมิดครั้งที่ 1** = `{FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }`
- **ประเภทการละเมิดครั้งที่ 2** = `{FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }`
- **จำนวนประเภทการละเมิด** = `IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END`
- **จำนวนการละเมิด** = `IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END`
- **ค่าปรับโดยเฉลี่ย** = `SUM ([Total Amount Paid]) / SUM([Number of Infractions])`
- **โรงเรียนสอนขับรถครั้งที่ 1** = `{FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }`
- **โรงเรียนสอนขับรถครั้งที่ 2** = `{FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }`
- **จำนวนการเข้าเรียนโรงเรียนสอนขับรถ** = `(CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)`

**หมายเหตุ**: ขอขอบคุณเป็นพิเศษสำหรับหัวข้อ Workout Wednesday ของ Ann Jackson [ลูกค้าใช้จ่ายมากขึ้นในการซื้อครั้งแรกหรือครั้งที่สองหรือไม่](https://www.workout-wednesday.com/2018/06/13/week-24-do-customers-spend-more-on-their-first-or-second-purchase/) และเคล็ดลับ Tableau Prep ของ Andy Kriebel [การส่งคืนวันที่ซื้อครั้งแรกและครั้งที่สอง](https://www.vizwiz.com/2018/06/first-second-purchase.html?m=1) ซึ่งให้แรงบันดาลใจเริ่มต้นสำหรับบทแนะนำนี้ การคลิกลิงก์เหล่านี้จะนำคุณออกจากเว็บไซต์ Tableau Tableau ไม่สามารถรับผิดชอบความถูกต้องหรือความใหม่ของหน้าต่างๆ ที่ผู้ให้บริการภายนอกเป็นผู้ดูแลได้ โปรดติดต่อเจ้าของหากคุณมีคำถามเกี่ยวกับเนื้อหาของพวกเขา