gpt4 book ai didi

types - F# 查询,按单列对多个值进行分组

转载 作者:行者123 更新时间:2023-12-05 01:04:52 25 4
gpt4 key购买 nike

我有一个 F# sql 查询,它需要对每组中的两列求和。

let financials = query{
for data in dbData do
groupValBy (data.earning, data.losses) data.store into group
select (group.Key, group.Sum(fun (group) -> fst group), group.Sum(fun (group) -> snd group))
}

我无法找到任何有关如何执行此操作的示例,但是此代码编译得很好,并且根据每个迹象,它应该可以工作。但是,在执行时,我总是收到一条异常消息“无法将节点‘新建’格式化为 SQL 执行。”如果我删除 data.losses 一切正常,但添加第二个值会导致错误。有没有另一种方法可以做到这一点?建议将不胜感激。

请注意,这个问题类似,但处理多列分组的相反情况: groupby multiple columns in a F# 3.0 query

更新:

我还尝试了以下方法:
(NewAnonymousObjectHelper(T(data.earning, data.losses)))

其中 T 是:
type T(earning : decimal, losses : decimal) =
member val Earning=earning with get,set
member val Losses=losses with get,set

但是,需要创建一个新的 Sum 函数来接受类型 T。我也尝试使用 F# PowerPack 中的 MutableTuple,但未能让它识别 MutableTuple(对这个代码/dll 和相关的命名空间不是很熟悉)。但它似乎应该工作:
let t = MutableTuple<_,_>(item1=data.earning,item2=data.losses)
groupValBy t data.store into group

也许有人可以就我在这里遗漏的内容提出建议。

结论:

看起来像在选择之前使用 let 来总结结果是要走的路。不清楚为什么 group.Sum() 在选择行上不起作用。 (注意:我上面提到的错误消息是由一些 sql server 问题引起的。)

最佳答案

这可能是仅使用 groupBy 的另一种解决方案,但仅使用 linq to objects 对其进行了测试。

type Data =
{Store : string; Earning : float; Losses : float }

let dbData =
[| { Store = "Store A"; Earning = 5.0; Losses = 2.0 }
{ Store = "Store A"; Earning = 10.0; Losses = 3.0 }
{ Store = "Store B"; Earning = 3.0; Losses = 1.0 } |]

let financials =
query {
for data in dbData do
groupBy data.Store into group
let earnings = query { for g in group do sumBy g.Earning }
let losses = query { for g in group do sumBy g.Losses }
select (group.Key, earnings, losses) } |> Seq.toArray

关于types - F# 查询,按单列对多个值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com