我正在尝试编写一个查询来获取具有条件的表的总和。例如这张桌子
area | machine | status | qty
1 | machine1 | inprocess | 210
1 | machine2 | pending | 120
1 | machine3 | done | 50
2 | machine1 | inprocess | 30
2 | machine2 | done | 170
Run Code Online (Sandbox Code Playgroud)
我想要的结果是
area | inprocess sum | pending sum | done sum | all sum
1 | 210 | 120 | 50 | 380
2 | 30 | 0 | 170 | 200
Run Code Online (Sandbox Code Playgroud)
我正在考虑带条件的 group by 子句,但我似乎无法获得解决此问题所需的解决方案。我试过的是
select …Run Code Online (Sandbox Code Playgroud) 我已经看遍了,不幸的是,我似乎无法弄清楚我做错了什么。我正在开发一个使用 MySQL 服务器的个人财务管理应用程序。对于这个问题,我有 4 个表正在处理。
该TRANSACTIONS表包含列CATID和BILLID其是指在主键SECONDARYCATEGORIES和BILLS表。无论是TRANSACTIONS与BILLS表具有一列PCATID,其指的是在一个主键PRIMARYCATEGORIES表。
我正在构建一个 SQL 查询,该查询对TRANSACTIONS表中的“amount”列求和,并返回PCATID与该值相关联的所有记录的主键和总和。如果BILLID设置为-1,它应该PCATID在SECONDARYCATEGORIESwhere 中找到SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID,否则(因为-1表明这不是账单),它应该PCATID从匹配的BILL记录中找到。BILLS.IDTRANSACTIONS.BILLID
我正在寻找这样的东西(显然不是有效的 SQL):
SELECT
SECONDARYCATEGORIES.PCATID,
SUM(TRANSACTIONS.AMOUNT)
FROM
TRANSACTIONS
IF (BILLID = -1) JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID
ELSE JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = BILLS.CATID WHERE BILLS.ID = TRANSACTIONS.BILLID …Run Code Online (Sandbox Code Playgroud) 我一直注意到Postgres(8.3)中简单聚合性能的一些问题.问题是,如果我有一个表(例如200M行),它是(customer_id,order_id)唯一的,那么查询select customer_id,max(order_id) from larger_table group by customer_id比执行以下操作的简单Java/JDBC程序慢一个数量级:
1)初始化一个空的HashMap customerMap(这将映射id - >最大订单大小)2)执行"select customer_id,order_id from greater_table",并获得一个流结果集3)迭代结果集,在每一行做类似的事情下列:
long id = resultSet.getLong("customer_id");
long order = resultSet.getLong("order_id");
if (!customerMap.containsKey(id))
customerMap.put(id,order);
else
customerMap.put(id,Math.max(order,customerMap.get(id)));
Run Code Online (Sandbox Code Playgroud)
预计会有这种性能差异吗?我不应该想,因为我认为上面的内容与内部发生的情况非常接近.是否有证据表明db存在错误/错误调整?
我的SSRS报告中需要一个行值,该值是基于报告中已经使用的几个字段计算出来的.我希望它显示在名为'textboxPercentageValue'的文本框中.在半简单英语中,表达式/公式为:
If the value of the "Week" field is "WK1", display the value of the Variance field divided by the value of the Price field; otherwise, just display the value from the Variance field.
Run Code Online (Sandbox Code Playgroud)
在VB脚本gobbledygook中,我添加到textboxPercentageValue的Value属性的表达式/公式是:
=IIF((Fields!Week.Value="WK1"), Fields!Variance.Value / Fields!Price.Value, Fields!Variance.Value)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将.rdl文件上传到SQL Server Reporting Services时,我得到:
" 文本框'textboxPercentageValue'的值表达式直接指向字段'Week'而不指定数据集聚合.当报表包含多个数据集时,数据区域外的字段引用必须包含在指定数据集范围的聚合函数中.(rsFieldReferenceAmbiguous)获取联机帮助文本框'textboxPercentageValue'的值表达式直接指向字段'Variance'而不指定数据集聚合.当报表包含多个数据集时,数据区域外的字段引用必须包含在聚合函数中指定数据集范围.(rsFieldReferenceAmbiguous)获取联机帮助文本框'textboxPercentageValue'的值表达式直接指向字段'Price'而不指定数据集聚合.当报表包含多个数据集时,数据区域外的字段引用必须包含在指定数据集范围的聚合函数中.(rs FieldReferenceAmbiguous)获取联机帮助文本框'textboxPercentageValue'的值表达式直接指向字段'Variance'而不指定数据集聚合.当报表包含多个数据集时,数据区域外的字段引用必须包含在指定数据集范围的聚合函数中.(rsFieldReferenceAmbiguous) "
那么我需要做些什么来使这个表达式/公式明确无法与SQL Server Reporting Services或VBScript解析器或"谁"抱怨它?
假设我定义了一条包含字段 的记录std_ulogic_vector来表示更大的std_ulogic_vector. 使用串联将此记录转换为大向量非常简单(无需知道每个字段的大小)。
我该如何做相反的事情,例如将大数据转换std_ulogic_vector回记录?
例子 :
architecture RTL of record_conversion is
type data_t is record
top : std_ulogic_vector(4 downto 0);
bottom : std_ulogic_vector(2 downto 0);
end record data_t;
signal record_s : data_t;
signal vector_s : std_ulogic_vector(7 downto 0);
begin
-- vector to record works
--vector_s <= record_s.top & record_s.bottom;
-- record to vector does not work
(record_s.top, record_s.bottom) <= vector_s;
-- tedious solution with knowledge of the field size
record_s.top <= vector_s(7 downto 3); …Run Code Online (Sandbox Code Playgroud) 我有一个域Aggregate,称之为"Order",其中包含OrderLines列表.订单会跟踪订单行上的金额总和.客户有一个正在运行的"信用"余额,他们可以从中订购,通过汇总其数据库事务的历史记录来计算.一旦他们用尽了"池"中的所有钱,他们就无法订购更多产品.
因此,每次在订单中添加一行时,我需要检查池中剩余的数量以及订单是否将它们推到了它上面.池中的金额不断变化,因为其他相关客户不断使用它.
问题是,考虑到DDD,我如何得到这个数量,因为我不想用DataContext问题污染我的域层(在这里使用L2S).由于我不能只从域中查询数据库,我如何获取该数据以便验证业务规则?
这是使用域事件的实例吗?
我想知道为什么在Neo4j的Cypher中这被认为是对聚合函数的无效使用:
MATCH (p:Project)-[:EMPLOYS]-(n:Person) SET p.youngest = MIN(n.age);
Run Code Online (Sandbox Code Playgroud)
虽然以下被认为是有效的用例:
MATCH (p:Project)-[:EMPLOYS]-(n:Person) RETURN p.name, MIN(n.age) AS youngest;
Run Code Online (Sandbox Code Playgroud)
我应该如何重写第一个查询以使其有效?
仍然阅读和学习DDD并尝试将其应用于我正在进行的项目.我仍然试图绕过Aggregates并遇到一个有趣的问题.
假设我有2个聚合,1个拥有root用户实体,另一个用户实体用于root用户.
没有用户但用户可以创建帐户,这就是为什么它们都作为自己的聚合的根.注意,它们的聚合包括其他实体,但这对我的问题并不重要.
一些业务规则:1)创建帐户时,它必须与用户关联.如果用户不存在,则必须先创建它.
2)删除帐户时,还必须删除其关联的用户.
3)创建用户时,不需要与帐户关联.
3)删除用户时,如果与帐户关联,则也必须删除.
由于帐户和用户形成自己的聚合,因此可能会有自己的存储库.这意味着每个存储库都将定义标准的Add,Delete,Find和Delete方法.
因此,在这些情况下,完成以下操作的最佳方法是:1)创建帐户时,我想我会在其用户属性上调用一个方法来验证用户确保它存在.这是正确的吗?
2)删除帐户时,如何删除其关联的用户.从帐户Repoistory?但这不只是重复用户存储库中的代码吗?或者存储库可以引用并互相调用吗?
3)当用户被删除时,最好的方法是确定它是否与帐户相关联并删除它而没有代码重复(可能与第二个问题类似).
我在某处读到如果逻辑跨越两个实体或聚合,请考虑使用服务.但我对此并不满意,因为什么阻止了客户端(假设API将在不断发展,用户将来还有其他演示文稿)绕过服务并只是调用存储库?
更新1:
刚刚意识到这可能是一个相关的问题:我应该如何在聚合根之间强制实现关系和约束?
java domain-driven-design repository aggregateroot aggregates
因此,在Laravel中获得sum()/ count()非常简单......但是我如何看待过去一个月,并且每天获得行数总和?
EG ...按日创建它们.
所以我想返回一个计数,如3,2,4,5这意味着在今天的日期创建了3行,昨天创建了2行,前一天创建了4行......等等
如何在Laravel轻松完成这项工作?当我通过created_at使用组时,它总是返回1.
有谁知道怎么做?
谢谢
我是 DDD 的初学者,我尝试用 C# 优雅地建模下一个场景:
基本上只有一个名称属性和必须按特定顺序执行的项目列表的模板。
public class Template
{
public string Name { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string Name { get; set; }
public int Order { get; set; }
}
Run Code Online (Sandbox Code Playgroud)一种称为 Profile 的类型。
public class Profile
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)profile 类的意思是
这看起来像是聚合根是模板,其中包含项目列表和配置文件列表。但我觉得按配置文件名称搜索需要我搜索具有给定名称的配置文件的所有模板。不知何故,对于具有 CRUD 背景的人来说,这似乎要付出高昂的代价。此外,配置文件是使用模板的配置文件,并且让模板了解使用它的配置文件似乎是错误的。
你如何建模?这里的聚合根应该是什么?是不止一个吗?如果您想从 UI 中使用搜索,如何执行搜索?
aggregates ×10
sql ×2
bids ×1
c# ×1
cypher ×1
database ×1
group-by ×1
java ×1
join ×1
laravel ×1
mysql ×1
neo4j ×1
oracle ×1
performance ×1
postgresql ×1
rdl ×1
record ×1
repository ×1
vbscript ×1
vhdl ×1