<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: billy6go</title>
    <description>The latest articles on DEV Community by billy6go (@billy6go).</description>
    <link>https://dev.to/billy6go</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4054241%2Ff4508eab-414c-4ebf-97f0-0f19e4a75059.png</url>
      <title>DEV Community: billy6go</title>
      <link>https://dev.to/billy6go</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billy6go"/>
    <language>en</language>
    <item>
      <title>INDEX/MATCH with SUMIF in Excel: two patterns that solve different problems</title>
      <dc:creator>billy6go</dc:creator>
      <pubDate>Sat, 01 Aug 2026 17:36:22 +0000</pubDate>
      <link>https://dev.to/billy6go/indexmatch-with-sumif-in-excel-two-patterns-that-solve-different-problems-3jhn</link>
      <guid>https://dev.to/billy6go/indexmatch-with-sumif-in-excel-two-patterns-that-solve-different-problems-3jhn</guid>
      <description>&lt;p&gt;&lt;code&gt;INDEX/MATCH with SUMIF&lt;/code&gt; sounds like one formula pattern, but people usually mean one of two different tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;sum rows that match a condition while choosing the sum column from a header; or&lt;/li&gt;
&lt;li&gt;return one value from the row where two conditions match.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those tasks need different formulas. Separating them first prevents a formula that looks plausible but answers the wrong question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 1: choose the SUMIF column from a header
&lt;/h2&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;column A contains a region;&lt;/li&gt;
&lt;li&gt;columns B:D contain monthly amounts;&lt;/li&gt;
&lt;li&gt;cell E2 contains the region to sum;&lt;/li&gt;
&lt;li&gt;cell F1 contains the month header to select.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUMIF($A$2:$A$100,$E2,INDEX($B$2:$D$100,0,MATCH(F$1,$B$1:$D$1,0)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it from the inside out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MATCH(F$1,$B$1:$D$1,0)&lt;/code&gt; finds the exact month column.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;INDEX($B$2:$D$100,0,...)&lt;/code&gt; returns that complete column as the sum range.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SUMIF($A$2:$A$100,$E2,...)&lt;/code&gt; adds values only for rows whose region matches E2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final &lt;code&gt;0&lt;/code&gt; in &lt;code&gt;MATCH&lt;/code&gt; matters. It requests an exact header match. Without it, an unsorted header row can produce a believable but incorrect result.&lt;/p&gt;

&lt;p&gt;If you want a compact comparison of SUMIF, SUMIFS, XLOOKUP, VLOOKUP, and INDEX/MATCH, use this &lt;a href="https://formulabrief.com/sumif-vs-sumifs-vlookup-xlookup-index-match/?utm_source=devto&amp;amp;utm_medium=community_post&amp;amp;utm_campaign=formula_index_match_sumif_aug2026" rel="noopener noreferrer"&gt;formula-pattern guide&lt;/a&gt;. It keeps the examples, assumptions, and common argument-order trap together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assumptions to make visible
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$A$2:$A$100&lt;/code&gt; and the selected sum column cover the same rows.&lt;/li&gt;
&lt;li&gt;The month header in F1 appears once in B1:D1. &lt;code&gt;MATCH&lt;/code&gt; returns the first duplicate.&lt;/li&gt;
&lt;li&gt;Amount cells are numeric rather than numbers stored as text.&lt;/li&gt;
&lt;li&gt;Full-column array ranges are avoided so recalculation stays bounded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the sum has two row conditions — for example region and product — use &lt;code&gt;SUMIFS&lt;/code&gt; instead of forcing both conditions through &lt;code&gt;INDEX/MATCH&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUMIFS($D$2:$D$100,$A$2:$A$100,$F2,$B$2:$B$100,$G2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SUMIF&lt;/code&gt; puts the optional sum range last. &lt;code&gt;SUMIFS&lt;/code&gt; puts the sum range first. Mixing those argument orders is a common source of incorrect formulas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 2: return one row with two criteria
&lt;/h2&gt;

&lt;p&gt;Now suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;column A contains account IDs;&lt;/li&gt;
&lt;li&gt;column B contains months;&lt;/li&gt;
&lt;li&gt;column D contains the value to return;&lt;/li&gt;
&lt;li&gt;F2 and G2 contain the requested account and month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a lookup, not an aggregation. In current Excel, XLOOKUP can express it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=XLOOKUP(1,($A$2:$A$100=$F2)*($B$2:$B$100=$G2),$D$2:$D$100,"Not found")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an older-workbook INDEX/MATCH pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=INDEX($D$2:$D$100,MATCH(1,($A$2:$A$100=$F2)*($B$2:$B$100=$G2),0))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each comparison produces TRUE or FALSE. Multiplication turns the row where both tests are true into &lt;code&gt;1&lt;/code&gt;, and the lookup searches for that exact value.&lt;/p&gt;

&lt;p&gt;Older perpetual Excel releases may require confirming the INDEX/MATCH version as an array formula. Current Microsoft 365 evaluates it directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check duplicates before trusting the result
&lt;/h3&gt;

&lt;p&gt;Both lookup formulas return the first matching row. They do not warn that the same account-and-month pair appears twice.&lt;/p&gt;

&lt;p&gt;If duplicates are valid, decide whether the task should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;return all matches with &lt;code&gt;FILTER&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;add them with &lt;code&gt;SUMIFS&lt;/code&gt;; or&lt;/li&gt;
&lt;li&gt;reject the duplicate key in the source data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That decision belongs in the task definition, not in a hidden formula assumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short decision rule
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One condition and a sum: &lt;code&gt;SUMIF&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Several conditions and a sum: &lt;code&gt;SUMIFS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;One matching record in current Excel: &lt;code&gt;XLOOKUP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;One matching record with older-version compatibility: &lt;code&gt;INDEX/MATCH&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A header chooses which column to sum: &lt;code&gt;SUMIF&lt;/code&gt; with an &lt;code&gt;INDEX/MATCH&lt;/code&gt; sum range.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before filling any formula down, test one known match, one known miss, and one duplicate case. A formula is only useful when its assumptions are as visible as its result.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>data</category>
    </item>
    <item>
      <title>Anonymous survey design starts with a data inventory, not a checkbox</title>
      <dc:creator>billy6go</dc:creator>
      <pubDate>Thu, 30 Jul 2026 05:23:02 +0000</pubDate>
      <link>https://dev.to/billy6go/anonymous-survey-design-starts-with-a-data-inventory-not-a-checkbox-43dj</link>
      <guid>https://dev.to/billy6go/anonymous-survey-design-starts-with-a-data-inventory-not-a-checkbox-43dj</guid>
      <description>&lt;p&gt;“Anonymous” is often implemented as a missing name field.&lt;/p&gt;

&lt;p&gt;That is a start, but it is not a design method. A survey can omit a name and still connect an answer to an account, invitation token, IP address, cookie, device identifier, tiny team, or revealing free-text detail.&lt;/p&gt;

&lt;p&gt;The useful engineering question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which identity paths does this task actually need, and what happens if we remove each one?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Want to inspect the pattern before the implementation checklist? &lt;a href="https://candorkit.com/?utm_source=devto&amp;amp;utm_medium=community_post&amp;amp;utm_campaign=candorkit_7day_cta_aug2026" rel="noopener noreferrer"&gt;CandorKit&lt;/a&gt; creates one account-free survey with separate respondent and owner links and a seven-day database expiry. It is for low-risk feedback, not protected reporting or regulated research.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Inventory the data path before writing the form
&lt;/h2&gt;

&lt;p&gt;List every value that can enter, leave, or persist in the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;survey title and questions&lt;/li&gt;
&lt;li&gt;response choices and free text&lt;/li&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;li&gt;account or invitation identifiers&lt;/li&gt;
&lt;li&gt;network and device metadata&lt;/li&gt;
&lt;li&gt;analytics events&lt;/li&gt;
&lt;li&gt;exported files and copied summaries&lt;/li&gt;
&lt;li&gt;administrative secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then label each item as required, optional, or prohibited for the specific task. “The framework collects it by default” is not a requirement.&lt;/p&gt;

&lt;p&gt;CandorKit’s application database stores survey text, answers, timestamps, a hash of the private owner key, and an expiry timestamp. It does not attach names, account IDs, IP addresses, user agents, or cookie IDs to answers.&lt;/p&gt;

&lt;p&gt;That statement is narrower than “nobody can identify a respondent.” Network providers still process ordinary requests. Question wording, small groups, unique events, and free text can reveal a person even when the application omits identity columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Split respondent access from owner access
&lt;/h2&gt;

&lt;p&gt;A public response URL and a private results URL serve different trust roles. Reusing one bearer link for both makes accidental disclosure easier.&lt;/p&gt;

&lt;p&gt;CandorKit creates a private owner secret and places it in the URL fragment. Browsers do not send fragments in the normal HTTP request path. The server stores a hash rather than the raw key.&lt;/p&gt;

&lt;p&gt;This design has a cost: there is no recovery workflow. If the owner loses the private link, the service cannot reconstruct access. That trade-off should be visible before the survey is shared, not hidden in support documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Give retention an executable boundary
&lt;/h2&gt;

&lt;p&gt;“We delete data when it is no longer needed” is not an operational rule.&lt;/p&gt;

&lt;p&gt;An executable rule needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a known expiry timestamp;&lt;/li&gt;
&lt;li&gt;rejection of new reads or writes after expiry;&lt;/li&gt;
&lt;li&gt;a cleanup process;&lt;/li&gt;
&lt;li&gt;visible user wording;&lt;/li&gt;
&lt;li&gt;a statement about copies outside the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CandorKit assigns each survey a seven-day database expiry, rejects expired access, and runs scheduled cleanup. CSV exports, screenshots, copied analysis, and other downstream files are outside that automatic deletion boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep analytics away from sensitive payloads
&lt;/h2&gt;

&lt;p&gt;An analytics event should describe product behavior, not survey content. Do not send titles, questions, answers, owner keys, or private links into session replay or event properties.&lt;/p&gt;

&lt;p&gt;The same rule belongs in logging and error reporting. A masked UI is not enough if a request body or exception payload copies sensitive text elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design the questions as part of the privacy model
&lt;/h2&gt;

&lt;p&gt;Infrastructure cannot rescue a survey that asks respondents to identify themselves in prose.&lt;/p&gt;

&lt;p&gt;For sensitive feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avoid asking for names, exact locations, employee IDs, or unnecessary demographics;&lt;/li&gt;
&lt;li&gt;warn people not to name themselves or others in free text;&lt;/li&gt;
&lt;li&gt;avoid combinations that isolate one person in a small group;&lt;/li&gt;
&lt;li&gt;choose multiple-choice or ranges when exact values add no task value;&lt;/li&gt;
&lt;li&gt;do not use a lightweight anonymous survey for emergencies, regulated reporting, or protected whistleblowing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical lesson is that anonymous survey design is subtractive. Remove identity paths, shorten retention, separate privileges, and name the remaining limits.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>security</category>
      <category>product</category>
    </item>
  </channel>
</rss>
