วิธีแก้ไขข้อผิดพลาด "คอลัมน์ไม่ถูกต้องในรายการที่เลือกเนื่องจากไม่มีอยู่ในฟังก์ชันการรวมหรือคำสั่ง GROUP BY"

ความผิดพลาด "คอลัมน์ไม่ถูกต้องในรายการที่เลือกเนื่องจากไม่มีอยู่ในฟังก์ชันการรวมหรือคำสั่ง GROUP BY” ที่กล่าวถึงด้านล่างนี้เกิดขึ้นเมื่อคุณดำเนินการ“GROUP BY” และคุณได้รวมคอลัมน์อย่างน้อยหนึ่งคอลัมน์ในรายการที่เลือกซึ่งไม่ได้เป็นส่วนหนึ่งของกลุ่มตามส่วนคำสั่งและไม่มีอยู่ในฟังก์ชันการรวมเช่น สูงสุด (), นาที (), ผลรวม (), จำนวน () และ ค่าเฉลี่ย (). ดังนั้นเพื่อให้การสืบค้นทำงานได้เราจำเป็นต้องเพิ่มคอลัมน์ที่ไม่ได้รวมทั้งหมดลงในกลุ่มตามข้อถ้าเป็นไปได้และไม่มีผลกระทบใด ๆ ต่อผลลัพธ์หรือรวมคอลัมน์เหล่านี้ไว้ในฟังก์ชันการรวมที่เหมาะสมและสิ่งนี้จะทำงานได้อย่างมีเสน่ห์ ข้อผิดพลาดเกิดขึ้นใน MS SQL แต่ไม่ใช่ใน MySQL

คำหลักสองคำ "จัดกลุ่มตาม” และ“ฟังก์ชันรวม"ถูกใช้ในข้อผิดพลาดนี้ ดังนั้นเราต้องเข้าใจว่าจะใช้เมื่อใดและอย่างไร

จัดกลุ่มตามข้อ:

เมื่อนักวิเคราะห์ต้องการสรุปหรือรวบรวมข้อมูลเช่นกำไรขาดทุนยอดขายต้นทุนและเงินเดือน ฯลฯ โดยใช้ SQL“GROUP BY” มีประโยชน์มากในเรื่องนี้ ตัวอย่างเช่นเพื่อสรุปยอดขายรายวันเพื่อแสดงต่อผู้บริหารระดับสูง ในทำนองเดียวกันหากคุณต้องการนับจำนวนนักศึกษาในภาควิชาในกลุ่มมหาวิทยาลัยพร้อมกับฟังก์ชันการรวมจะช่วยให้คุณบรรลุสิ่งนี้ได้

จัดกลุ่มตามกลยุทธ์ Split-Apply-Combine:

จัดกลุ่มตามใช้กลยุทธ์ "แยกใช้ - รวม"

ในรูปด้านบนเราจะเห็นว่าคอลัมน์ถูกแบ่งออกเป็นสามกลุ่มตามคอลัมน์แรก C1 จากนั้นฟังก์ชันการรวมจะถูกนำไปใช้กับค่าที่จัดกลุ่ม ในการรวมเฟสสุดท้ายจะกำหนดค่าเดียวให้กับแต่ละกลุ่ม

สิ่งนี้สามารถอธิบายได้โดยใช้ตัวอย่างด้านล่าง ขั้นแรกสร้างฐานข้อมูลชื่อ "appuals"

ตัวอย่าง:

สร้างตาราง“ลูกจ้าง” โดยใช้รหัสต่อไปนี้

ใช้ [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo]. [staff] ([e_id] [int] NOT NULL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [เงินเดือน] [int] NULL, CONSTRAINT [PK_employee] PRIMARY KEY CLUSTERED ([e_id] ASC) ด้วย (PAD_INDEX = ปิด, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ONLOW_POW_PUTE หลัก]) บน [หลัก] ไปตั้งค่า ANSI_PADDING ปิดไป

ตอนนี้แทรกข้อมูลลงในตารางโดยใช้รหัสต่อไปนี้

แทรกลงในค่าพนักงาน (e_id, e_ename, dep_id, เงินเดือน) (101, 'Sadia', 1,6000), (102, 'Saba', 1,5000), (103, 'Sana', 2,4000), ( 104, 'Hammad', 2,3000), (105, 'Umer', 3,4000), (106, 'Kanwal', 3,2000)

ผลลัพธ์จะเป็นแบบนี้

ตอนนี้เลือกข้อมูลจากตารางโดยดำเนินการคำสั่งต่อไปนี้

เลือก * จากพนักงาน

ผลลัพธ์จะเป็นแบบนี้

ตอนนี้จัดกลุ่มตามตารางตามรหัสแผนก

เลือก dep_id เงินเดือนจากกลุ่มพนักงานตาม dep_id

ข้อผิดพลาด: คอลัมน์ "staff.sallary" ไม่ถูกต้องในรายการที่เลือกเนื่องจากไม่มีอยู่ในฟังก์ชันการรวมหรือคำสั่ง GROUP BY

ข้อผิดพลาดที่กล่าวถึงข้างต้นเกิดขึ้นเนื่องจากมีการเรียกใช้แบบสอบถาม "GROUP BY" และคุณได้รวมคอลัมน์ "staff.salary" ไว้ในรายการเลือกซึ่งไม่ได้เป็นส่วนหนึ่งของกลุ่มตามข้อหรือรวมอยู่ในฟังก์ชันการรวม

สารละลาย:

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

เลือก dep_id, avg (เงินเดือน) เป็นค่าเฉลี่ยของเงินเดือนจากกลุ่มพนักงานโดย dep_id

นอกจากนี้หากเราวาดภาพตารางนี้ตามโครงสร้าง Split_apply_combine ก็จะมีลักษณะเช่นนี้

รูปด้านบนแสดงให้เห็นว่าก่อนอื่นตารางจะถูกจัดกลุ่มออกเป็นสามกลุ่มตาม id แผนกจากนั้นฟังก์ชัน aggregate avg () จะถูกนำไปใช้เพื่อค้นหาค่าเฉลี่ยรวมของเงินเดือนซึ่งจะรวมกับ ID แผนก ดังนั้นตารางจึงถูกจัดกลุ่มตามรหัสแผนกและเงินเดือนจะถูกรวมแผนกอย่างชาญฉลาด

ฟังก์ชันรวม:

คำอธิบายเชิงตรรกะของการใช้ฟังก์ชันกลุ่มและรวมเข้าด้วยกัน:

ตอนนี้เราจะเข้าใจการใช้ "จัดกลุ่มตาม" และ "ฟังก์ชันรวม" อย่างมีเหตุผลผ่านทางตัวอย่าง

สร้างตารางชื่อ“คน” ในฐานข้อมูลโดยใช้รหัสต่อไปนี้

USE [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. [people] ([id] [bigint] IDENTITY (1,1) NOT NULL, [name] [varchar] (500) NULL, [ เมือง] [varchar] (500) NULL, [state] [varchar] (500) NULL, [age] [int] NULL) ON [PRIMARY] GO

ตอนนี้แทรกข้อมูลลงในตารางโดยใช้แบบสอบถามต่อไปนี้

แทรกลงในค่าผู้คน (ชื่อเมืองรัฐอายุ) ('Meggs', 'MONTEREY', 'CA', 20), ('Staton', 'HAYWARD', 'CA', 22), ('Irons', 'IRVINE', 'CA', 25) ('Krank', 'PLEASANT', 'IA', 23), ('Davidson', 'WEST BURLINGTON', 'IA', 40), ('Pepewachtel', 'FAIRFIELD ',' IA ', 35) (' Schmid ',' HILLSBORO ',' OR ', 23), (' Davidson ',' CLACKAMAS ',' OR ', 40), (' Condy ',' GRESHAM ',' หรือ ', 35)

ผลลัพธ์จะเป็นดังนี้:

หากนักวิเคราะห์ต้องการทราบว่าไม่มีผู้อยู่อาศัยและอายุของพวกเขาในรัฐต่างๆ แบบสอบถามต่อไปนี้จะช่วยเขาในการรับผลลัพธ์ที่ต้องการ

เลือกอายุนับ (*) เป็น no_of_residents จากกลุ่มคนตามรัฐ

ข้อผิดพลาด: คอลัมน์ "people.age" ไม่ถูกต้องในรายการที่เลือกเนื่องจากไม่มีอยู่ในฟังก์ชันการรวมหรือคำสั่ง GROUP BY

ในการดำเนินการค้นหาดังกล่าวข้างต้นเราพบข้อผิดพลาดต่อไปนี้

“ ข่าวสารเกี่ยวกับ 8120 ระดับ 16 สถานะ 1 บรรทัด 16 คอลัมน์ "people.age" ไม่ถูกต้องในรายการที่เลือกเนื่องจากไม่มีอยู่ในฟังก์ชันการรวมหรือ GROUP BY clause”

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไฟล์ “ จัดกลุ่มตาม” ดำเนินการค้นหาและคุณได้รวมไว้ "'คน. อายุ" คอลัมน์ในรายการเลือกซึ่งไม่ได้เป็นส่วนหนึ่งของกลุ่มตามข้อหรือรวมอยู่ในฟังก์ชันการรวม

การจัดกลุ่มตามรัฐเกิดข้อผิดพลาด

คำอธิบายเชิงตรรกะและวิธีแก้ปัญหา:

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

ค้นหาว่าไม่มีผู้อยู่อาศัยพร้อมกับอายุเฉลี่ยของผู้อยู่อาศัยในแต่ละรัฐ เมื่อพิจารณาถึงสิ่งนี้เราต้องแก้ไขแบบสอบถามของเราดังที่แสดงด้านล่าง

เลือกสถานะเฉลี่ย (อายุ) เป็นอายุนับ (*) เป็น no_of_residents จากกลุ่มคนตามรัฐ

สิ่งนี้จะดำเนินการโดยไม่มีข้อผิดพลาดและผลลัพธ์จะเป็นเช่นนี้

ดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องคิดอย่างมีเหตุผลเกี่ยวกับสิ่งที่จะส่งคืนในคำสั่ง select

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

จัดกลุ่มตามและค่า NULL:

ขั้นแรกให้เพิ่มแถวอื่นในตารางชื่อ“ people” โดยให้คอลัมน์“ state” ว่างเปล่า / null

แทรกลงในค่าผู้คน (ชื่อเมืองรัฐอายุ) ('Kanwal', 'GRESHAM', '', 35)

ตอนนี้ดำเนินการคำสั่งต่อไปนี้

เลือกสถานะเฉลี่ย (อายุ) เป็นอายุนับ (*) เป็น no_of_residents จากกลุ่มคนตามรัฐ

รูปต่อไปนี้แสดงผลลัพธ์ คุณสามารถเห็นค่าว่างในคอลัมน์สถานะถือเป็นกลุ่มแยกต่างหาก

ตอนนี้เพิ่มแถวที่ไม่มีค่าว่างโดยการแทรกแถวเพิ่มเติมลงในตารางโดยมีค่าว่างเป็นสถานะ

แทรกเข้าไปในค่าผู้คน (ชื่อเมืองรัฐอายุ) ('Kanwal', 'IRVINE', 'NULL', 35), ('Krank', 'PLEASANT', 'NULL', 23)

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

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

Facebook Twitter Google Plus Pinterest