 <p>From the "Core Data Programming Guide":</p> <blockquote> <p>... To summarize, though, if you execute a fetch directly, you should typically not add Objective-C-based predicates or sort descriptors to the fetch request. Instead you should apply these to the results of the fetch.</p> </blockquote> <p>This means that you cannot use a custom sort descriptor in your fetch request. You must store an additional (non-transient) attribute in the entity, for example "0", "1", "2" for positive/negative/zero sums.</p> <p>You can then use this attribute for both the sort descriptor <em>and</em> for the <code>sectionNameKeyPath</code>, you don't need a transient attribute "sectionName".</p> <p>The mapping from "0", "1", "2" to the actual section header is then done in <code>tableView:titleForHeaderInSection:</code>.</p> <pre><code>- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { id &lt;NSFetchedResultsSectionInfo&gt; sectionInfo = [[self.controller sections] objectAtIndex:section]; int order = [[sectionInfo name] intValue]; if (order == 0) return @"POSITIVE SECTION"; else if (order == 1) return @"NEGATIVE SECTION"; else return @"ARCHIVE SECTION"; } </code></pre>