(Немного сложный) SQL-запрос? - PullRequest
3 голосов
/ 18 марта 2012

У меня есть это сложное (для меня) требование, и я был бы признателен за запрос SQL.Вот сделка:

  • В файле Access есть эта таблица с именем «Расходы».
  • Таблица содержит поля «Категория», «Сумма», «Плательщик» и «IsShare. "
  • Категория может быть Газовая, Продовольственные товары, Товары для дома и т. Д. ...
  • Сумма - это сумма в долларах для расходов.
  • Плательщиком может быть либо я, либо мойбрат («Я» или «Братан»).
  • IsShare может быть как истинным, так и ложным.В основном, если IsShare верен, то расходы делятся на две части.В противном случае плательщик платит за все это.

Мне нужен запрос SQL, чтобы рассчитать все мои расходы для определенной категории.Он должен быть рассчитан следующим образом:

  • 100% всех нераспределенных предметов, которые я оплатил (Плательщик = «Я» И IsShare = false),
  • 50% отвсе общие элементы, которые я оплатил (Payer = 'Me' AND IsShare = true), и
  • 50% всех общих элементов, которые оплачен моим братом (Payer = 'Bro' AND IsShare = true).

Запрос должен возвращать сумму всех этих трех элементов.

Пока у меня есть предварительный запрос, но он возвращает неверные результаты.Может ли кто-нибудь исправить это для меня?

Большое спасибо.

return @"SELECT Sum(Amount) AS TotalAmount " +
        "FROM Expenses " +
        "WHERE Category = 'Groceries' " +
        "AND Payer = 'Me' " +
        "AND Share = false " +
        "GROUP BY Category " +
        "UNION " +
        "SELECT 0.5 * Sum(Amount) AS TotalAmount " +
        "FROM Expenses " +
        "WHERE Category = 'Groceries' " +
        "AND Payer = 'Me' " +
        "AND Share = true " +
        "GROUP BY Category " +
        "UNION " +
        "SELECT 0.5 * Sum(Amount) AS TotalAmount " +
        "FROM Expenses " +
        "WHERE Category = 'Groceries' " +
        "AND Payer = 'Bro' " +
        "AND Share = true ";
        "GROUP BY Category";

1 Ответ

2 голосов
/ 18 марта 2012

Я не думаю, что СОЮЗ необходим для того, что вы пытаетесь сделать.Это передаст данные один раз и поместит значения в отдельные столбцы.Возможно, вам придется привести или преобразовать 0.5 в определенный тип, у меня не было возможности запустить это.

SELECT 
     Category,
     SUM(CASE WHEN Payer='me' AND NOT IsShare THEN Amount ELSE 0 END) as IPaid,
     SUM(CASE WHEN Payer='me' AND IsShare THEN Amount * 0.5 ELSE 0 END) as SharedPay,
     SUM(CASE WHEN Payer='bro' AND IsShare THEN Amount * 0.5 ELSE 0 END) as BrotherPay
FROM Eexpenses
WHERE Category = 'Groceries'
GROUP BY Category

Для MS ACCESS:

SELECT 
     Category,
     SUM(IIF(Payer='me' AND NOT IsShare, Amount,0)) as IPaid,
     SUM(IIF(Payer='me' AND IsShare, Amount * 0.5, 0)) as SharedPay,
     SUM(IIF(Payer='bro' AND IsShare, Amount * 0.5, 0)) as BrotherPay
FROM Eexpenses
WHERE Category = 'Groceries'
GROUP BY Category

Добавить три столбца вместе:

SELECT Category, IPaid, SharedPay, BrotherPay, IPay + SharedPay + BotherPay as Total 
FROM (
    SELECT 
         Category,
         SUM(IIF(Payer='me' AND NOT IsShare, Amount,0)) as IPaid,
         SUM(IIF(Payer='me' AND IsShare, Amount * 0.5, 0)) as SharedPay,
         SUM(IIF(Payer='bro' AND IsShare, Amount * 0.5, 0)) as BrotherPay
    FROM Eexpenses
    WHERE Category = 'Groceries'
    GROUP BY Category
) as T1
...