SQL SELECT - GROUP BY - PullRequest
       9

SQL SELECT - GROUP BY

0 голосов
/ 18 мая 2018

Очень много, начиная с SQL.

Я пытаюсь собрать данные из пары таблиц, чтобы получить сводную информацию, в которой значения из первой таблицы сгруппированы по полю Repcode и суммированы.И в результирующем курсоре должно быть описание, взятое из второй таблицы путем поиска в поле Repcode.

Это очень упрощенная тестовая программа

CREATE CURSOR Nomtot (tcode C(4), tRepcode C(2), tBalance N(9,2))
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("A001", "12", 123.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B003", "17", 555.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B006", "19", 666.00)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("E008", "12", 810.00)

CREATE CURSOR RepLook (tRepcode C(2), tDesc C(30))
INSERT INTO Replook(tRepcode, tDesc) VALUES ("12", "Materials")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("17", "Carriage")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("19", "Dividends")

SELECT a.tRepcode, SUM(a.tBalance) AS tBalance, b.tDesc ;
  FROM Nomtot a, Replook b ;
  GROUP BY a.tRepcode ;
  WHERE a.tRepcode = b.tRepcode ;
  INTO CURSOR cResult

Это, однако, производитошибка: команда SQL GROUP BY отсутствует или недействительна.Если я затем изменю оператор на GROUP BY a.tRepcode, b.tDesc;,,,программа выдает нужный результат.Зачем нужен этот второй пункт?Я делаю это правильно

Благодарен за руководство.Благодаря.

Ответы [ 5 ]

0 голосов
/ 30 мая 2018

Ответ Цетина Басоса верный, и его следует принять как ответ, но я хочу добавить еще одну вещь, которую вы можете использовать с функциями MAX () или MIN () с неагрегированными полями, такими как

SELECT MAX(a.tRepcode) AS tRepcode, SUM(a.tBalance) AS tBalance, MAX(b.tDesc) AS tDesc ;
  FROM Nomtot a, Replook b ;
  GROUP BY a.tRepcode ;
  WHERE a.tRepcode = b.tRepcode ;
  INTO CURSOR cResult
0 голосов
/ 18 мая 2018

Вам необходимо включить все неагрегированные столбцы в группу по.Это причина.Лучший способ написать этот запрос:

CREATE CURSOR Nomtot (tcode C(4), tRepcode C(2), tBalance N(9,2))
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("A001", "12", 123.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B003", "17", 555.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B006", "19", 666.00)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("E008", "12", 810.00)

CREATE CURSOR RepLook (tRepcode C(2), tDesc C(30))
INSERT INTO Replook(tRepcode, tDesc) VALUES ("12", "Materials")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("17", "Carriage")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("19", "Dividends")

SELECT a.tRepcode, a.tBalance, b.tDesc ;
  FROM ;
  (select tRepCode, sum(tBalance) as tBalance ;
   from nomtot ;
   group by tRepCode ) a ;
  inner join Replook b on a.tRepcode = b.tRepcode ;
  INTO CURSOR cResult ;
  nofilter
0 голосов
/ 18 мая 2018

Причина в том, что SQL нужно будет агрегировать по всем колоннам, которые не являются вычислениями.

В других языках, таких как SAS, это не требуется, но ваши вычисления будут основываться только на том, что имеет группа по.Другими словами, ваш SUM (a.tBalance) будет иметь одинаковое значение для всех b.tDesc.В вашем случае это может быть совпадение один к одному, и это не имеет значения, но в некоторых других случаях ваш b.Table может иметь несколько совпадающих значений и иметь разные суммы .... Другой способ сделать это без необходимости включать b.tDesc in group by:
выберите a. *, b.tDesc из (ВЫБРАТЬ a.tRepcode, SUM (a.tBalance) AS tBalance ОТ Nomtot) внутреннее объединение Replook b
для a.tRepcode = b.tRepcode;

0 голосов
/ 18 мая 2018

Если вы используете vfp 8 или 9, то все, что вам нужно сделать, это добавить одну строку кода в начало вашей программы.

SET ENGINEBEHAVIOR 70

на вашем примере.

SET ENGINEBEHAVIOR 70

CREATE CURSOR Nomtot (tcode C(4), tRepcode C(2), tBalance N(9,2))
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("A001", "12", 123.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B003", "17", 555.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B006", "19", 666.00)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("E008", "12", 810.00)

CREATE CURSOR RepLook (tRepcode C(2), tDesc C(30))
INSERT INTO Replook(tRepcode, tDesc) VALUES ("12", "Materials")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("17", "Carriage")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("19", "Dividends")

SELECT a.tRepcode, SUM(a.tBalance) AS tBalance, b.tDesc ;
  FROM Nomtot a, Replook b ;
  GROUP BY a.tRepcode ;
  WHERE a.tRepcode = b.tRepcode ;
  INTO CURSOR cResult

Конечно, вы можете переписать запрос правильным образом, но это все равно работает.

0 голосов
/ 18 мая 2018

добавьте группу для всех столбцов, не участвующих в функции агрегации, и переместите группу перед группой на

SELECT a.tRepcode, SUM(a.tBalance) AS tBalance, b.tDesc 
FROM Nomtot a, Replook b 
WHERE a.tRepcode = b.tRepcode 
GROUP BY a.tRepcode, b.tDesc 

или используя текущий стиль соединения (как предложено YogeshSharma)

SELECT a.tRepcode, SUM(a.tBalance) AS tBalance, b.tDesc 
FROM Nomtot a
INNER JOIN  Replook b ON a.tRepcode = b.tRepcode 
GROUP BY a.tRepcode, b.tDesc 
...