SQL SUM по нескольким таблицам

#c# #sql #ms-access

#c# #sql #ms-access

Вопрос:

Благодаря Густаву я намного ближе к решению своей проблемы.

Я использую его код, но он не способен правильно суммировать.

tblKasse
tblKursspielbuchung

Я отладил свой код, и когда я хочу суммировать за 1 год, я получаю этот sql-запрос: "SELECT Datum, Sum(Kosten) FROM tblKursspielbuchung, tblKasse WHERE tblKursspielbuchung.Datum >= #2019/01/01# AND tblKursspielbuchung.Datum < #2020/01/01# GROUP BY Datum"

Например, я получаю 1460 вместо 730, что было бы правильным ответом. Я могу думать только о том, что проблемой может быть наличие нескольких строк для рейсов со стоимостью. У меня возникают проблемы с избавлением от них, когда я их суммирую. Я был бы признателен, если бы кто-нибудь мог сказать мне, как использовать distinct или что-то подобное в этой ситуации. Если ничего не работает, я должен изменить код, чтобы у меня не было одинаковой стоимости в нескольких строках.

Ответ №1:

Вы могли бы построить свой SQL следующим образом:

 int year = int.Parse(txtJahr.Text);

"SELECT Datum, Sum(Kosten) FROM tblKursspielbuchung, tblKasse WHERE tblKursspielbuchung.Datum >= #"   new DateTime(year, 1, 1).ToString("yyyy'/'MM'/'dd")   "# AND tblKursspielbuchung.Datum < #"   new DateTime(year   1, 1, 1).ToString("yyyy'/'MM'/'dd")   "# GROUP BY Datum";
  

Комментарии:

1. Это работает. Мне просто нужно было добавить # » перед вторым новым DateTime

2. Поскольку у меня есть несколько записей, я должен группировать по Datum и FlightID.

3. Не будете ли вы так любезны переписать свой код для работы с month? "SELECT Datum, Sum(Kosten) FROM tblKasse, tblKursspielbuchung WHERE tblKursspielbuchung.Datum >= #" new DateTime(year, month, 1).ToString("yyyy'/'MM'/'dd") "# AND tblKursspielbuchung.Datum < #" new DateTime(year, month 1, 1).ToString("yyyy'/'MM'/'dd") "# GROUP BY Datum"; К сожалению, у меня это не работает. Используя этот код в Access, я получаю за каждую запись в месяце в качестве стоимости стоимость года.

4. "SELECT Datum, Sum(Kosten) FROM tblKursspielbuchung, tblKasse GROUP BY Datum"; Поскольку month не работает, я проверил, работает ли year, когда я удаляю предложение WHERE. Похоже, что предложение where никогда не используется. Sum (Kosten) мгновенно вычисляет сумму и после этого не изменяется. Может быть, мне нужно к этому где-нибудь присоединиться. Обе таблицы связаны с FlightID.

5. Передача значения месяца также будет работать, так что вы будете делать что-то еще.

Ответ №2:

Часто проблема со сравнением дат заключается в том, что способ построения compare настраивает его на сравнение как строку, а не как дату. Я бы сделал преобразование даты перед вставкой значения в выбранную вами строку. Если сравнение происходит в MS ACCESS, вам нужно будет обернуть дату символом #, то есть #date#

Ответ №3:

В MS Access константы даты имеют специальный синтаксис. Я также настоятельно рекомендую JOIN . Я подозреваю, что вы хотите что-то вроде этого:

 SELECT ks.Datum, Sum(Kosten)
FROM tblKursspielbuchung as ks INNER JOIN
     tblKasse as k
     ON ks.Datum = k.Datum
WHERE ks.Datum >= #01/01/2019# AND 'ks.Datum < #01/01/2010#
GROUP BY ks.Datum;
  

Комментарии:

1. Это вроде как работает. Мне пришлось изменить вашу строку 4 на ON ks. FlightID = k.FlightID потому что это мой внешний ключ, по которому я могу к ним присоединиться. Как ни странно, это дает мне только 880 в качестве ответа, а не 1320. У меня есть 6 строк с 220, и только 4 суммируются. Не могли бы вы проверить, правильно ли используется в вашей строке 6′? Возможно, именно по этой причине некоторые числа не суммируются.