การค้นหา / การสืบค้นที่ซับซ้อนต้องมีวิธีที่ง่ายกว่า


0

ฉันได้พบกับความต้องการนี้หลายครั้งและสามารถสรุปได้ว่าจะต้องมีวิธีที่ง่ายขึ้นและปรับขนาดได้มากขึ้นเพื่อทำสิ่งที่ฉันพยายามทำที่นี่

โดยพื้นฐานแล้วฉันต้องการตาราง 3 มิติที่ฉันสามารถสร้างผลรวมกับ ...

รับสองตาราง: | People | One | Two | Three | Four | Five | Six | |--------|-----|-----|-------|------|------|-----| | John | x | x | | | | | | James | | x | x | | | | | Jim | | | x | x | | | | Jean | | | | x | x | | | Jammie | | | | | x | x | | Janis | x | | | | | x | และ | Event | Data | |-------|------| | One | 1 | | Two | 2 | | Three | 3 | | Four | 4 | | Five | 5 | | Six | 6 |

ฉันกำลังสร้างผลรวมตามเซลล์ที่ไม่ว่างในตารางที่ 1 และค่าที่เกี่ยวข้องในตารางที่สองเพื่อสร้าง: | Totals | |--------| | 3 | | 5 | | 7 | | 9 | | 11 | | 7 |

ฉันใช้ vlookup ที่ซับซ้อนเพื่อผลิตสิ่งนี้: =SUM( IF(NOT(ISBLANK(Table1[@One])),VLOOKUP(Table1[[#Headers],[One]],Table2,2,FALSE),0), IF(NOT(ISBLANK(Table1[@Two])),VLOOKUP(Table1[[#Headers],[Two]],Table2,2,FALSE),0), IF(NOT(ISBLANK(Table1[@Three])),VLOOKUP(Table1[[#Headers],[Three]],Table2,2,FALSE),0), IF(NOT(ISBLANK(Table1[@Four])),VLOOKUP(Table1[[#Headers],[Four]],Table2,2,FALSE),0), IF(NOT(ISBLANK(Table1[@Five])),VLOOKUP(Table1[[#Headers],[Five]],Table2,2,FALSE),0), IF(NOT(ISBLANK(Table1[@Six])),VLOOKUP(Table1[[#Headers],[Six]],Table2,2,FALSE),0) )

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

* โปรดทราบว่าในตัวอย่างนี้ฉันใช้ผลรวม แต่ในบางกรณีฉันอาจมีข้อความที่ฉันต้องการทำTEXTJOINหรือคล้ายกัน


1
ถ้าคุณรู้สึกว่ามันซับซ้อนเกินไปใน Excel คุณอาจต้องการฐานข้อมูล แน่นอนคุณจะต้องยกเลิกการหมุนตารางแรก
Daniel B

คุณต้องการฐานข้อมูล นี่จะง่ายสำหรับแบบสอบถาม SQL
ตัวปลอมตัว Twisty

ใช่จุดหนึ่งที่ผมพยายามที่จะดูว่ามีวิธีการใช้ excel แผ่นเป็นแหล่งข้อมูลเพื่อที่ฉันสามารถใช้ฟังก์ชันใน SQL ของ Excel ของสะสมข้อมูลภายนอกที่ ...
Pezius

คุณสามารถทำสิ่งนี้ได้อย่างง่ายดายด้วย SUMPRODUCT () คุณจำเป็นต้องสร้างสองอาร์เรย์คูณพวกเขาและใช้ SUMPRODUCT ตอนนี้ฉันอยู่บน iPad แต่ฉันจะโพสต์คำตอบในวันพรุ่งนี้ ถ้าคุณต้องการลองอาร์เรย์แรกจะไม่ใช่ (ISBLANK ($ B2: $ G2)) อันดับที่สองคือ TRANSPOSE ($ B $ 10: $ B $ 16) ฉันไม่ได้หมุนที่นี่เพื่อความชัดเจนลอง SUMPRODUCT (Array1 * Array2) และดูว่านั่นจะให้คำตอบที่ถูกต้องเมื่อถูกเติมและฉันจะกลับมาอีกในวันพรุ่งนี้
Bandersnatch

คุณหมายถึงว่าในตารางที่ 1 คุณต้องการนับจำนวน X ที่เติมในคอลัมน์และเพิ่มค่าด้วยค่าที่สอดคล้องกันในตารางที่ 2 เช่นเดียวกับตารางที่ 1 2X ในคอลัมน์ที่ 1 ในคอลัมน์ที่ 1 + 1 จากคอลัมน์ข้อมูลในตารางที่ 2 = 3 แก้ไข?
Rajesh S

คำตอบ:


1

สูตรอาร์เรย์นี้ถูกเติมลงใน H2 จากภาพหน้าจอด้านล่างแสดงผลลัพธ์

=SUM(NOT(ISBLANK($B2:$G2))*TRANSPOSE(B$10:B$15))

ตั้งแต่นี้เป็นสูตรอาร์เรย์ก็จะต้องเข้ามามีมากกว่าแค่CTRL ShiftEnterEnter

ป้อนคำอธิบายรูปภาพที่นี่

มันทำงานอย่างไร: NOT(ISBLANK($B2:$G2))ให้อาเรย์ของTrue/Falseค่าด้วยFalseทุกที่ที่เซลล์ในช่วงนั้นว่างเปล่า (ดูหมายเหตุด้านล่าง) ถ้าคุณเน้นส่วนหนึ่งของสูตรในแถบสูตรที่และตีที่สำคัญคุณจะเห็นอาร์เรย์F9 {TRUE,TRUE,FALSE,FALSE,FALSE,FALSE}(พิมพ์CTRL-Z เพื่อเลิกทำ)

(B$10:B$15)เป็นเพียงรายการของตัวเลขในคอลัมน์ข้อมูลของคุณและTRANSPOSE()แปลงจากอาร์เรย์ในแนวตั้งเป็นแนวนอน

ในการคูณTrue/Falseค่าจะถือว่าเป็น1และ0ดังนั้นผลลัพธ์จึงเป็นอาร์เรย์ที่มีค่าข้อมูลทุกที่ที่มีxและเป็นศูนย์ที่อื่น จากนั้นSUM()เพิ่มอาร์เรย์และส่งกลับผลรวมตามที่กรอก

แก้ไข:
OP เพิ่มให้กับคำถามของเขาบอกว่าเขาอาจจะมีค่าข้อความในB6:B10และการดำเนินการที่พวกเขาไม่ได้อยู่กับแต่ฟังก์ชั่นอื่นอาจจะเป็นSUM()TEXTJOIN()

เพื่อจัดการความเป็นไปได้ของค่าที่ไม่ใช่ตัวเลขนิพจน์นี้:

IF(NOT(ISBLANK($B2:$G2)),TRANSPOSE(B$10:B$15),)

ส่งกลับอาร์เรย์ด้วยค่าข้อมูลทุกที่ที่มี "x" และFalseที่อื่น ๆ มันทำงานอย่างถูกต้องสำหรับทั้งข้อความและค่าตัวเลข

โดยการรวมvalue_if_falseในIF()(หลังจากเครื่องหมายจุลภาคสุดท้าย) Falseค่าอาจถูกแทนที่ด้วย0หรือblankหรือสิ่งที่อาจจำเป็นต้องใช้โดยฟังก์ชั่นที่ทำหน้าที่ในอาร์เรย์

หมายเหตุ:

  1. ISBLANK()มันควรจะตั้งชื่อISEMPTY()เพราะเซลล์ที่มีอย่างแท้จริงเป็นที่ว่างเปล่าสำหรับการกลับมาISBLANK() Trueหากเซลล์มีสูตร แต่ดูเหมือนว่างเปล่า, จะกลับมาISBLANK() มีปัญหาเดียวกันดังนั้นหากคุณมีสูตรในเซลล์ "ว่าง" คุณสามารถเปลี่ยนอาร์เรย์แรกเป็น FalseISTEXT()(($B2:$G2)="x")
  2. หากTRANSPOSE()ไม่มีอยู่การคูณ (และIF() ฟังก์ชั่น) จะให้อาร์เรย์แบบ 2 มิติซึ่งจะทำให้ยุ่ง

ฉันหวังว่าสิ่งนี้จะช่วยและโชคดี


ฉันรู้สึกว่าสิ่งนี้อาจจะใกล้เคียงกัน แต่เนื่องจากคุณไม่สามารถทำการทดสอบ "ทวีคูณ" ได้วิธีการทำงานในฟังก์ชั่นข้อความแทนที่จะเป็นเลขคณิต เช่นหากข้อมูลของตารางที่ 2 เป็นชื่อผลไม้ ~ และฉันคาดว่าจะเห็นในผลรวม: แอปเปิ้ล, กล้วย | กล้วย, เชอร์รี่ เชอร์รี่, ทุเรียน ... ฯลฯ
Pezius

ฉันแค่ใช้การคูณเพราะคุณมีจำนวนผลรวมในตอนแรก =IF(NOT(ISBLANK($B2:$G2)),TRANSPOSE(B$10:B$15))สูตรนี้จะสร้างอาร์เรย์เดียวกันและทำงานร่วมกับข้อความหรือตัวเลข: ถ้าคุณเปลี่ยนจำนวนเต็มในB10:B15กับ Uno, Dos, Tres ฯลฯ {"Uno","Dos",FALSE,FALSE,FALSE,FALSE}สูตรนี้ส่งกลับอาร์เรย์
Bandersnatch

ขึ้นอยู่กับว่าจะใช้ฟังก์ชันใดในอาเรย์นี้ IF () สามารถแทนที่องค์ประกอบเท็จด้วย 0 หรือว่างเปล่าหรือ ...
Bandersnatch

1
อ๋อ! ฉันจะบอกว่านั่นเป็นคำตอบที่แท้จริงที่นั่น!
Pezius

ไปแล้ว ช่วยตัวของคุณเอง. :-)
Bandersnatch

0

SUMIF()หลังจากที่คิดเกี่ยวกับเรื่องนี้น้อยมากมีวิธีที่ง่ายมากใช้ แต่ตารางที่สองของคุณจะต้องจัดเรียงในแนวนอน

=SUMIF(B2:G2,"x",B$10:G$10)

ป้อนคำอธิบายรูปภาพที่นี่


SUMIF ใช้งานได้ทั้งหมด แต่เฉพาะกับผลรวมเลขคณิตอย่างไรก็ตามฉันอาจต้องการทำสิ่งต่างๆด้วย TEXTJOIN หรือฟังก์ชั่นอื่น ๆ ที่ไม่ใช่ผลรวม
Pezius

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

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

ดูสูตรที่แก้ไขแล้วในข้อคิดเห็นกับคำตอบอื่นของฉัน
Bandersnatch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.