Sql 从具有多个具有相同属性id和个人金额的项的表返回累积查询

Sql 从具有多个具有相同属性id和个人金额的项的表返回累积查询,sql,sqlite,Sql,Sqlite,我有两张桌子: 成分包含以下字段: ID(数字)成分(文本)复数(文本) 其中,成分是成分名称,复数是其复数名称(例如:olive,olives) 和另一个带有以下字段的表Shopping\u components: 金额(数字),成分ID(数字) 我需要一个SQL语句,用于返回所有表购物配料和配料名称的Amount的附加值(如果没有复数,则为单数;如果有复数,则为复数) 例如: 成分: 1‘苹果’‘苹果’ 2“大蒜” 购物\u配料: 11 2.1 3.1 2.2 3.2 返回: 6‘苹果’ 5

我有两张桌子:

成分
包含以下字段:

ID
(数字)
成分
(文本)
复数
(文本)

其中,
成分
是成分名称,
复数
是其复数名称(例如:olive,olives)

和另一个带有以下字段的表
Shopping\u components

金额
(数字),
成分ID
(数字)

我需要一个SQL语句,用于返回所有表
购物配料
配料
名称的
Amount
的附加值(如果没有复数,则为单数;如果有复数,则为复数)

例如:

成分

1‘苹果’‘苹果’

2“大蒜”

购物\u配料

11

2.1

3.1

2.2

3.2

返回:

6‘苹果’


5“大蒜”

刚刚输入,但应该会让你非常接近

select count(*),
case x.plural='' then x.ingredient else x.plural end as Ingredient
from ingredients x
join Shopping_Ingredients y on y.ingredient_id=x.id
group by x.ingredient,x.plural

由于您没有指定所使用的数据库引擎,下面是SQL Server 2000及更高版本(可能也适用于MySQL)上的查询版本:

选择
T.金额,
案例
当T.数量时,尝试:


想法是首先用SUM选择所有数据,即select inrident、multiple和SUM of amount,然后检查是否存在multiple select multiple或select inrident。

有趣的解决方案,但请注意,在OP的问题中,multiple可以是“”(不是null,而是空字符串),amount是数字,所以你们应该检查金额OP并没有澄清复数是空字符串还是空字符串——示例包括“”,但问题是“当它并没有复数时是单数的”(这意味着空字符串,而不是空字符串)。我不知道罗马尼亚语,但在英语中复数表示0个数量,所以我们说0个苹果,1个苹果,2个或更多的苹果。(此外,我们不知道这是否适用于英语、罗马尼亚语或其他语言的使用者。)@MarkBannister该应用程序将用于英语用户如果成分没有复数,复数字段是空的还是空字符串?
SELECT 
    T.Amount, 
    CASE 
        WHEN T.Amount <= 1 THEN I.Ingredient
    ELSE 
        CASE WHEN ISNULL(I.Plural, '') = '' THEN I.Ingredient ELSE I.Plural END
    END
FROM
(
    SELECT SUM(Amount) Amount, Ingredient_ID FROM Shopping_Ingredients GROUP BY Ingredient_ID
) AS T
INNER JOIN Ingredient I ON
    I.Ingredient_ID = T.Ingredient_ID
;WITH CTE
AS
(
    SELECT SUM(Amount) Amount, Ingredient_ID FROM Shopping_Ingredients GROUP BY Ingredient_ID
)
SELECT 
    T.Amount, 
    CASE 
        WHEN T.Amount <= 1 THEN I.Ingredient
    ELSE 
        CASE WHEN ISNULL(I.Plural, '') = '' THEN I.Ingredient ELSE I.Plural END
    END
FROM CTE AS T
INNER JOIN Ingredient I ON
    I.Ingredient_ID = T.Ingredient_ID
select sum(s.Amount),
       case sum(s.Amount) 
            when 1 then max(i.Ingredient)
            else coalesce(max(i.Plural), max(i.Ingredient))
       end
from Ingredient i
left join Shopping_Ingredients s on s.Ingredient_ID = i.ID
group by i.ID
select a.amount, CASE WHEN a.plural is null then a.ingredient else plural end

(select i.id as id, i.ingredient as ingridient, i.plural as plural, SUM(si.amount) as amount
from ingredients i, shopping_ingridents si
where si.ingredient_id = i.id
group by i.id, i.ingredient, i.plural) a