programing

MariaDB: 계산된 열을 사용한 계산

goodsources 2023. 2. 2. 21:15
반응형

MariaDB: 계산된 열을 사용한 계산

SQL은 처음이라 Mariadb(10.3.15)에 대한 다른 계산 결과를 사용하여 계산하려고 합니다.서브쿼리를 사용하는 버전이 하나 있어요단, mysql, oracle 또는 SqlServer에 대해서는 기타 솔루션이나 이해하기 쉬운 솔루션이 논의되어 있습니다만, 모두 MariaDB에서는 동작하지 않습니다.

MariaDB SQL 구문이 조금 다른지 아니면 MariaDB에서 해당 기능을 사용할 수 없는지 알고 싶습니다.

CREATE TABLE test.testcalculation (
  ID int(11) NOT NULL AUTO_INCREMENT,
  num1 int(11) DEFAULT NULL,
  num2 int(11) DEFAULT NULL,
  num3 int(11) DEFAULT NULL,
  num4 int(11) DEFAULT NULL,
  PRIMARY KEY (ID)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;


USE test;
INSERT INTO testcalculation(num1, num2, num3, num4) VALUES(1, 2, 3, 4);
INSERT INTO testcalculation(num1, num2, num3, num4) VALUES(5, 10, 15, 20);

이것은 잘 동작합니다.

SELECT
  id,
  Number1,
  Number2,
  Number3,
  Number4,
  Sum1And2,
  Sum1And2Prod3,
  (Sum1And2 + Sum1And2Prod3) AS "SumOfCalculations"
FROM (SELECT
    id,
    num1 AS Number1,
    num2 AS Number2,
    num3 AS Number3,
    num4 AS Number4,
    (num1 + num2) AS Sum1And2,
    ((num1 + num2) * num3) AS Sum1And2Prod3
  FROM test.testcalculation) t;

(그런데 마지막에 't'가 아닌 것은 무엇입니까?)

그래서 저는 해결책이 있지만, 모든 것을 두 번 쓰는 것이고, 만약 제가 더 많은 수준의 계산이 필요하다면 매우 복잡해질 수도 있습니다.

이 논리는 Oracle에 대해 논의되었으며 Maria에게 적용되지 않습니다.DB

SELECT
  id,
  num1,
  num2,
  num3,
  num4,
  c.Sum1And2 AS Sum1And2,
  (c.Sum1And2 * num3) AS Sum1And2Prod3
  FROM test.testcalculation
  CROSS apply (SELECT (num1 + num2) AS Sum1And2) AS c;

MariaDB는 "cross-apply"를 모르는 것이 분명하다.

하지만 SQL과 MariaDB를 처음 접하는 저는 인터넷에서 찾은 다른 옵션을 알고 싶을 뿐입니다.

CREATE TABLE test.signups_by_month (
  id int(11) NOT NULL AUTO_INCREMENT,
  month date DEFAULT NULL,
  signups int(11) DEFAULT NULL,
  visitors int(11) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;


INSERT INTO signups_by_month(month, signups, visitors) VALUES('2014-06-01', 133, 1910);
INSERT INTO signups_by_month(month, signups, visitors) VALUES('2014-01-07', 95, 3151);
INSERT INTO signups_by_month(month, signups, visitors) VALUES('2014-01-08', 118, 1844);

    select 
      month, 
      signups, 
      visitors, 
      p as avg, 
      low, 
      high
    from signups_by_month,
    lateral (select signups / visitors as p) probability,
    lateral (select sqrt(p * (1 - p) / visitors) as se) std_error,
    lateral (select p - 1.94 * se as low) lower_bound,
    lateral (select p + 1.94 * se as high) upper_bound;

에러 메세지는, 에러가 발생하고 있는 것 뿐입니다.

SQL 구문에 오류가 있습니다.MariaDB 서버 버전에 대응하는 매뉴얼에서 '(select signups/visitors as p)' 확률 측면(17행 SQL4에서 sqrt(p * (1)' 선택)에 가까운 올바른 구문을 사용합니다.sql 1 5

MariaDB는 "lateral" 뒤에 "join"이 필요합니다.표준 SQL의 끝과 벤더의 구현이 어디서부터 시작되는지는 잘 모르겠습니다.방금 "lateral"이 SQL 99라고 읽었기 때문에 어떻게든 작동해야 한다고 생각했습니다.그리고 계산을 통해 계산하는 것은 그다지 화려한 로켓 과학이 아닙니다.

(크로스 적용/가로 방향) 단순히 MariaDB에서 동작하지 않는지 또는 동작하는 경우 어떻게 동작하는지 알고 싶습니다.저도 CTE를 조사해보았지만 아직 그 예를 실행하지 못했습니다.

다른 옵션을 설명하거나 (위의 예를 참고하여) 이것을 위한 "최적의" 솔루션을 설명해 줄 수 있는 사람이 있을지도 모릅니다.또는 서브쿼리 또는 CTE 이외에는 아무것도 없기 때문에(나 스스로 그것을 파고들 수 있습니다), 크로스 어플리케이션 또는 횡방향에 더 많은 시간을 할애할 필요가 없습니다.

이를 위한 한 가지 방법은 데이터베이스 변수를 사용하는 것입니다.

create table testcalc (
   id int(11) not null auto_increment,
   num1 int(11) default null,
   num2 int(11) default null,
   num3 int(11) default null,
   num4 int(11) default null,
   primary key(id)
);

insert into testcalc values
(default, 1, 2, 3, 4),
(default, 5, 10, 15, 20);

그런 다음 계산 결과를 다음과 같은 가변 구문에 저장하면 예시와 같은 결과를 얻을 수 있습니다.

@youVar := (calc) as resultName01

그러면 다음과 같이 계산하여 사용할 수 있습니다.

(@youVar + newCalc) as resultName02

우리는 이렇게 당신의 예에 적용할 수 있습니다.

select
   id,
   num1,
   num2,
   num3,
   num4,
   @1plus2 := (num1 + num2) as 1plus2,                   # create var01
   @1plus2mult3 := (@1plus2 * num3) as 1plus2mult3,      # create var02 using var01
   @sumOfCalc := (@1plus2 + @1plus2mult3) as sumOfCalc   # create var03 using var01 and var02
from testcalc;

그러면

| id | num1 | num2 | num3 | num4 | 1plus2 | 1plus2mult3 | sumOfCalc |
| 1  | 1    | 2    | 3    | 4    | 3      | 9           | 12        |
| 2  | 5    | 10   | 15   | 20   | 15     | 225         | 240       |

언급URL : https://stackoverflow.com/questions/57235178/mariadb-calculating-with-calculated-columns

반응형