SQLite如何从带分隔符的列文本对另一个表中的值求和?
对不起,如果我的问题是重复的,我会删除,如果是,但我找不到我想做的任何其他地方。也许我不知道该怎么问 我有三张桌子:SQLite如何从带分隔符的列文本对另一个表中的值求和?,sqlite,Sqlite,对不起,如果我的问题是重复的,我会删除,如果是,但我找不到我想做的任何其他地方。也许我不知道该怎么问 我有三张桌子: DROP TABLE IF EXISTS Order; CREATE TABLE Order( ORD_ID integer primary key ); DROP TABLE IF EXISTS Product; CREATE TABLE Product( PRO_ID integer primary key , PRO_Price double , PRO_Kind
DROP TABLE IF EXISTS Order;
CREATE TABLE Order(
ORD_ID integer primary key
);
DROP TABLE IF EXISTS Product;
CREATE TABLE Product(
PRO_ID integer primary key
, PRO_Price double
, PRO_Kind integer
);
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems(
ORI_ID integer primary key
, ORD_ID integer
, PRO_ID integer
, ORI_AddedIngredients varchar
, FOREIGN KEY (PRO_ID) REFERENCES Product(PRO_ID)
, FOREIGN KEY (ORD_ID) REFERENCES Order(ORD_ID)
);
其内容如下:
Table Product
=========================================
PRO_ID | PRO_Price | PRO_Kind
1 5 1
2 11 1
3 2 2
4 2 2
5 2 2
=========================================
Table OrderItems WHERE ORD_ID = 1
=========================================
ORI_ID | ORD_ID | PRO_ID | ORI_AddedIngredients
1 1 1 '3, 4'
2 1 1 null
3 1 2 null
4 1 1 null
5 1 1 null
6 1 1 '3, 4, 5'
=========================================
我想做一个查询,返回表中的和值,同时考虑产品的AddingElements,但是有AddingElements的产品不同于没有AddingElements的产品
结果会是这样的:
QUERY RESULT
========================================
ORD_ID | PRO_ID | Total
1 1 9
1 1 5
1 1 11
1 2 11
但是我不知道如何从包含ID的字段中读取ID,就像一个数组一样,我可以在没有ID的情况下进行查询,但是当我必须包含ID时,我不知道如何做
如果你们有更好的方法来组织表中的内容,请告诉我。你们必须将
OrderItems
加入到Product
的两个副本中,并聚合:
SELECT oi.ORI_ID, oi.ORD_ID, oi.PRO_ID,
MAX(p1.PRO_Price) + COALESCE(SUM(p2.PRO_Price), 0) Total
FROM OrderItems oi
INNER JOIN Product p1 ON p1.PRO_ID = oi.PRO_ID
LEFT JOIN Product p2 ON ',' || REPLACE(oi.ORI_AddedIngredients, ' ', '') || ',' LIKE '%,' || p2.PRO_ID || ',%'
GROUP BY oi.ORI_ID, oi.ORD_ID, oi.PRO_ID
如果列ORI\u AddedIngredients
中没有空格,则使用ORI\u AddedIngredients代替REPLACE(oi.ORI\u AddedIngredients,'','')
请参阅。
结果:
基于@forpas提供的查询,我能够构建生成我想要的问题结果的查询,谢谢@forpas:
SELECT
oi.ORD_ID
, oi.PRO_ID
, MAX(p1.PRO_ID) + COALESCE(SUM(p2.PRO_Price),0) Total
FROM OrderItems oi
JOIN Product p1 ON p1.PRO_ID = oi.PRO_ID
LEFT JOIN Product p2 ON ',' || REPLACE(oi.ORI_AddedIngredients, ' ', '') || ',' LIKE '%,' || p2.PRO_ID || ',%'
GROUP BY oi.PRO_ID, oi.ORD_ID, oi.ORI_AddedIngredients
此查询的关键点:
- 需要替换,这样类似的比较才能正确工作,如果它有任何空白点,它将只对其中一种成分求和,而不是对所有成分求和
- 折叠ORI_AddingElements具有相同值的成分就像在GROUP BY子句上添加字段一样简单,因此具有不同成分的相同产品ID具有不同的行点
- 在没有使用REPLACE的情况下,我设法发现代码在数据库中记录的是空格,而不仅仅是带有ID的分隔文本,但我将其保留在查询中,因为在将来的某个时候,如果我忘记并最终添加空格,它仍然可以工作
再次感谢@forpas提供查询和解释您是如何做到这一点的。解释比张贴答案更有价值,谢谢
编辑:经过几天的查询工作,尝试获取每种可能的情况组合的最终结果,我放弃了尝试将成分相加为产品基值乘以该订单的产品数量,可能是因为我不知道该怎么做,但我把值分成了两列,只要我想要总数,我就把它们相加。
这是最终结果,是的,它适合我的特定用例
SELECT
ip.IPE_ID
, ip.PED_ID
, ip.PRO_ID
, p1.PRO_Nome
, ip.IPE_Adicionados
, ip.IPE_Removidos
, (SELECT COUNT(ip2.PRO_ID)
FROM ItensPedido ip2
WHERE ip2.PRO_ID = ip.PRO_ID
AND ip2.PED_ID = ip.PED_ID
AND (ip2.IPE_Adicionados = ip.IPE_Adicionados
OR ip2.IPE_Removidos = ip.IPE_Removidos
OR ip.IPE_Adicionados is null AND ip.IPE_Removidos is null
)
GROUP BY IPE_Adicionados
) as IPE_Qtd
, COALESCE(SUM(p2.PRO_Preco),0) as IPE_PIngredientes
, (SELECT COUNT(ip2.PRO_ID) * ip2.IPE_Valor
FROM ItensPedido ip2
WHERE ip2.PRO_ID = ip.PRO_ID
AND ip2.PED_ID = ip.PED_ID
AND (ip2.IPE_Adicionados = ip.IPE_Adicionados
OR ip2.IPE_Removidos = ip.IPE_Removidos
OR ip.IPE_Adicionados is null AND ip.IPE_Removidos is null
)
GROUP BY IPE_Adicionados
) as IPE_PParcial
FROM ItensPedido ip
JOIN Produto p1 ON p1.PRO_ID = ip.PRO_ID
LEFT JOIN Produto p2
ON "," || REPLACE(ip.IPE_Adicionados, " ", "") || "," LIKE "%," || p2.PRO_ID || ",%"
WHERE ip.PED_ID = :PED_ID
GROUP BY p1.PRO_Nome, ip.PED_ID, ip.IPE_Adicionados, ip.IPE_Removidos
这是我的测试数据库中的一个示例结果:
IPE_ID PED_ID PRO_ID PRO_Nome IPE_Adicionados IPE_Removidos IPE_Qtd IPE_PIngredientes IPE_PParcial
7 1 1 Hamburguer null null 2 0 10
1 1 1 Hamburguer 28, 29 null 2 8 10
9 1 1 Hamburguer 28, 29, 30 null 1 6 5
2 1 37 Refrigerante Lata null null 2 0 8
3 1 7 X-Bacon null 46, 47 1 0 11
我不理解左连接行上的逻辑,它会转换成这样的东西:左连接乘积p2 on',“| null | | |”,“like%”,“| 1 | | |,%”
这是在比较什么?在ORI|u AddingCreditions
为null
的情况下,这个左连接将不匹配,所以合并(SUM(p2.专业价格),0)
将是0
。以其产品3和4作为订单1的组成部分为例,左连接行将是:左连接产品p2 ON',3,4',LIKE“%”,“| | 1 | | |,%”。
?如果产品3存在,将如何搜索表产品?抱歉,我没有得到这一行上的逻辑不是:…LIKE“%”,“| | 1 | |,%”是“%”、“| | p2.PRO|ID |”、“%”和“p2
是产品
的第二个副本,它的所有行都与进行比较,“|替换(oi.ORI|u AddedIngredients,”、“)| |',“
IN对值列表进行操作,但是ORI\u addedingredents
是一个包含逗号分隔的值列表的字符串,这就是为什么不能在中使用,但可以使用LIKE对字符串进行操作。但是,这是一般的想法。此查询不会返回预期的结果:到目前为止,我只检测到一个问题,即折叠的记录总数不是总和,所以它的ID为1的类似产品在表中甚至出现了3次,它只显示了1的价格,而不是所有3次的总和。除此之外,它还在工作……这个你用来测试查询的网站我不知道,从未使用过,链接向我显示404错误。我使用SQLite express操作我的查询和它提供的结果与我在我的应用程序中的查询是一样的。在上面的查询是有效的。上一个链接是有效的,这是另一个:@forpas这个.com链接对我有效,但由于某些原因,.uk不起作用,可能与我的ISP有关。感谢为PAS提供帮助,我真的很感激我喜欢它。
IPE_ID PED_ID PRO_ID PRO_Nome IPE_Adicionados IPE_Removidos IPE_Qtd IPE_PIngredientes IPE_PParcial
7 1 1 Hamburguer null null 2 0 10
1 1 1 Hamburguer 28, 29 null 2 8 10
9 1 1 Hamburguer 28, 29, 30 null 1 6 5
2 1 37 Refrigerante Lata null null 2 0 8
3 1 7 X-Bacon null 46, 47 1 0 11