当前位置: 首页 > 面试题库 >

如何在SWIFT的IOS CORE-DATA请求中使用SQL GROUP BY和SUM函数?

梁修贤
2023-03-14
问题内容

我有一个表(Transactions),其中包含包含Account_name和交易金额的记录。我想计算每个帐户的所有交易的总数,这些交易以“私人”开头且交易金额>1000。我想按名称降序排列这些帐户。

因此,SQL请求将如下所示:

    SELECT Account_name, SUM(Amount) 
    FROM Transactions
    WHERE Account_name like 'Private%'
    and Amount > 1000
    GROUP BY Account_name
    ORDER BY Account_name DESC

我将如何在Swift中使用Core-DATA做到这一点。

谢谢


问题答案:

请记住,CoreData不是关系数据库,因此您应该考虑的实体不是“表”,而对象不是“记录”。还要注意,按照惯例,属性名称不应以大写字母开头。也就是说,可以构造访存来实现所需的功能。关键步骤是:

  1. 创建一个提取请求
  2. 指定一个NSPredicate根据您选择的条件进行过滤
  3. 设置resultType.DictionaryResultType(“分组依据”所必需)
  4. 设置要包含在提取中的属性(要获取sum(),这涉及创建NSExpressionNSExpressionDescription)。
  5. 设置属性分组
  6. NSSortDescriptor按名称创建按顺序排序,降序
  7. 执行提取

请参见以下代码:

let fetch = NSFetchRequest(entityName: "Transaction")
let predicate = NSPredicate(format: "Account_name like %@ AND Amount > %@", "Private*",NSNumber(double: 1000.0))
fetch.predicate = predicate
fetch.resultType = .DictionaryResultType
let sumExpression = NSExpression(format: "sum:(Amount)")
let sumED = NSExpressionDescription()
sumED.expression = sumExpression
sumED.name = "sumOfAmount"
sumED.expressionResultType = .DoubleAttributeType
fetch.propertiesToFetch = ["Account_name", sumED]
fetch.propertiesToGroupBy = ["Account_name"]
let sort = NSSortDescriptor(key: "Account_name", ascending: false)
fetch.sortDescriptors = [sort]
let results = managedObjectContext?.executeFetchRequest(fetch, error: nil) as NSArray?

结果将是带有键“ Account_name”和“ sumOfAmount”的字典数组。

编辑 要提取特定Account_name的值,请使用另一个谓词:

    let newPredicate = NSPredicate(format: "Account_name like %@", "toto")!
    if let resultsArray = results { // to unwrap the optional
        let filteredResults = resultsArray.filteredArrayUsingPredicate(newPredicate)
        let sumOfAmount = (filteredResults[0] as NSDictionary)["sumOfAmount"] as Double
    }

我忽略了前面的示例过滤Account_name到以“ Private”开头的那些事实,并假设您将拥有一个(只有一个)名称为“
toto”的帐户(因此filteredResults[0]);您的生产代码应检查。



 类似资料:
  • 问题内容: 这是我使用的代码 我试图在客户表中的TotalP字段中设置一个值x。值x等于“产品”表中“客户ID”相同的对应价格的总和。 上面的代码返回错误 问题答案: 您可以使用DSum: 但是,这确实引发了一个问题,即当可以从查询中获取信息时,为什么要使用计算值来更新表。

  • 如官方文档中所述,Cosmos Db SQL API支持聚合函数。然而,我找不到任何对项的多级文档结构执行聚合的良好查询示例。这是我的Cosmos DB容器项的结构。我正在使用SQL API } 我想得到发票明细的总和。使用SQL查询的lineTotal。非常感谢您的回答

  • 问题内容: 我想按数量加载最畅销的产品。这些是我的表: 这是我的Spring Data Repository: 我正在获取 HsqlException:找不到列:id 我认为此错误与id列无关,因为这两个表都存在。“按汇总查询”可用于Spring数据吗?因为对于Spring Data应该仅从数据库中选择产品属性,这对我来说似乎并不奇怪,并且使用此sql我们还选择了sum(po.quantity)。

  • 问题内容: 我在iBooks中阅读了Apple的The Programming Language Swift ,但无法弄清楚如何在Swift中发出HTTP请求(例如cURL)。我需要导入Obj- C类还是只需要导入默认库?还是无法基于本机Swift代码发出HTTP请求? 问题答案: 您可以使用,而且还是因为你通常在Objective- C做。请注意,对于iOS 7.0和更高版本,它是首选。 使用

  • 我在iBooks上读过Apple的编程语言Swift,但不知道如何在Swift中发出HTTP请求(类似于cURL)。我需要导入Obj-C类还是只需要导入默认库?或者不可能基于本机Swift代码发出HTTP请求?

  • 我在iBooks中阅读了苹果公司的编程语言Swift,但不知道如何在Swift中发出HTTP请求(类似cURL的东西)。我需要导入Obj-C类还是只需要导入默认库?还是不能基于原生Swift代码进行HTTP请求?