Возврат накопленного запроса из таблицы с несколькими записями с одинаковым property_id и личной суммой - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть 2 таблицы:

Ingredients со следующими полями:

ID (числовой) Ingredient (текст) Plural (текст)

, где Ingredient - это название ингредиента, а Plural - его имя во множественном числе (например, оливки, маслины)

и еще одна таблица Shopping_Ingredients с полями:

Amount (числовой), Ingredient_ID (числовой)

Мне нужен оператор SQL, который возвращает добавленное значение Amount для всей таблицы Shopping_Ingredients и имя Ingredient (единственное, когда у него нет множественного числа или множественного числа, когда оно есть)

пример:

Ingredients:

1 'яблоко' 'яблоки'

2 'чеснок' ''

Shopping_Ingredients

1 1

2 1

3 1

2 2

3 2

возврат:

6 'яблок'

5 'чеснок'

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Поскольку вы не указали, какой механизм базы данных используете, вот версия запроса, которая работает на SQL Server 2000 и более поздних версиях (возможно, работает и на MySQL):

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

А здесь для SQL Server2005 и новее:

;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
0 голосов
/ 18 ноября 2011
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

Идея состоит в том, чтобы сначала выбрать все данные с помощью СУММЫ, то есть выбрать ингредиент, множественное число и сумму суммы, а затем проверить, существует ли множественное число, выбрать множественное число, иначе выбрать ингредиент.

0 голосов
/ 18 ноября 2011

Попробуйте:

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
0 голосов
/ 18 ноября 2011

Только что набрал, но должен приблизить вас

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...