используя результаты запроса, выполняя дальнейшие вычисления с этими результатами в том же запросе, дающем ошибку - PullRequest
0 голосов
/ 07 июля 2011

я написал запрос вот так и я хочу еще рассчитать с этими результатами, что всем в одном запросе

SELECT  TIMESTAMPDIFF(MONTH,memberToMship_StartDate,memberToMship_EndDate)* memberToMship_ChargePerPeriod As totalcontractamountperiod ,
   DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS exppayments,
   30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS monthlyamount, 
   (totalcontractamountperiod/monthlyamount) as exppayments, 
   member_Id 
FROM membertomships;

Возможно ли, что все приходит в одном запросе, используя mysql

но выдает ошибку вот так

Error Code: 1054
Unknown column 'totalcontractamountperiod' in 'field list'

может кто-нибудь иметь представление об этом

ИЗМЕНЕННЫЙ КОД: я сделал так, используя подзапросы ....

SELECT  
  EXPPAYMENT WHERE EXPPAYMENT =(TIMESTAMPDIFF(MONTH, memberToMship_StartDate,memberToMship_EndDate)* memberToMship_ChargePerPeriod As totalcontractamountperiod ,
  DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS exppayments , 
  30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS monthlyamount , 
  (totalcontractamountperiod/monthlyamount) as exppayments, member_Id 
FROM membertomships);

но выдает ошибку вот так

Error Code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE EXPPAYMENT =(TIMESTAMPDIFF(MONTH, memberToMship_StartDate,memberToMship_En' at line 1

и это модифицированный запрос, и к нему добавлены еще две функции, но все равно он выдавал ошибку

SELECT 
  Total,
  (datdiff-1) as diff,
  ceil(ExpPayments-Total) AS datdiff,                 
  ExpPayments, 
  MonthlyAmount, 
  (Total/MonthlyAmount) as ExpPayments2, 
  member_Id 
FROM 
( 
  SELECT TIMESTAMPDIFF(MONTH,memberToMship_StartDate,memberToMship_EndDate)*    memberToMship_ChargePerPeriod As Total,     
  DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS ExpPayments,
  30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS MonthlyAmount, 
  member_Id
FROM 
  membertomships 
) as SourceTable;

ошибка, подобная этой

                     Error Code: 1054
                     Unknown column 'datdiff' in 'field list'

Не могли бы вы помочь

               SELECT 
                SourceTable.Total,
               ceil(SourceTable.ExpPayments-SourceTable.Total) AS datdiff,                 
              ceil(SourceTable.ExpPayments-SourceTable.Total) -1 as diff,
                       ADDDATE(ADDDATE(NOW(), INTERVAL FLOOR(ceil(SourceTable.ExpPayments-   SourceTable.Total) -1) MONTH), INTERVAL DAY(NOW()) - SourceTable.memberToMship_DueDay DAY) As expdate,
              SourceTable.ExpPayments, 
             SourceTable.MonthlyAmount, 
           (SourceTable.Total/SourceTable.MonthlyAmount) as ExpPayments2, 
            SourceTable.member_Id 
        FROM 
        ( 
              SELECT TIMESTAMPDIFF(MONTH,memberToMship_StartDate,memberToMship_EndDate)*      memberToMship_ChargePerPeriod As Total,     
          DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS ExpPayments,
          30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS MonthlyAmount, 
           member_Id
          FROM 
         membertomships 
      ) as SourceTable

Код ошибки: 1054 Неизвестный столбец «SourceTable.memberToMship_DueDay» в «списке полей»

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Я сокращу некоторые имена столбцов, так как они немного длиннее, поэтому запрос может быть более понятным:

SELECT  TIMESTAMPDIFF(MONTH,StartDate,EndDate)* ChargePerPeriod As Total,
        DATEDIFF(GREATEST(NOW(),DueDay),StartDate)/30 AS ExpPayments,    
        30* ChargePerPeriod / DATEDIFF(EndDate,StartDate) AS MonthlyAmount,
--->    (Total/MonthlyAmount) as ExpPayments2,     
        member_Id  
FROM membertomships; 

Проблема в указанном ряду, так как вы используете Total и MonthlyAmount в том же списке столбцов, который их определяет. Я знаю, это выглядит так, как будто это должно работать, но использование SQL такого рода незаконно.

Что вы можете сделать:

  1. Повторите условие, которое определяет значения (и надеемся, что база данных рассчитает его только один раз), например

это:

SELECT  TIMESTAMPDIFF(MONTH,StartDate,EndDate)* ChargePerPeriod As Total,
        DATEDIFF(GREATEST(NOW(),DueDay),StartDate)/30 AS ExpPayments,    
        30* ChargePerPeriod / DATEDIFF(EndDate,StartDate) AS MonthlyAmount,
        (TIMESTAMPDIFF(MONTH,StartDate,EndDate)* ChargePerPeriod / (30* ChargePerPeriod / DATEDIFF(EndDate,StartDate))) as ExpPayments2,     
        member_Id  
FROM membertomships; 
  1. Переработать выражение как подзапрос. Вы выполняете вычисления за один шаг, а затем используете эти результаты для дальнейших вычислений, например

это:

SELECT Total, ExpPayments, MonthlyAmount, (Total/MonthlyAmount) as ExpPayments2, member_Id  from
(
  SELECT  TIMESTAMPDIFF(MONTH,StartDate,EndDate)* ChargePerPeriod As Total,
          DATEDIFF(GREATEST(NOW(),DueDay),StartDate)/30 AS ExpPayments,    
          30* ChargePerPeriod / DATEDIFF(EndDate,StartDate) AS MonthlyAmount,
          member_Id  
  FROM membertomships
) as SourceTable

Кстати, два столбца в исходном запросе называются ExpPayments, я переименовал второй ExpPayments2.

1 голос
/ 07 июля 2011
SELECT 
  derived.totalcontractamountperiod,
  derived.exppayments,
  derived.monthlyamount,
  (derived.totalcontractamountperiod/derived.monthlyamount) as exppayments2,
  derived.member_Id
FROM
( 
  SELECT  
    TIMESTAMPDIFF(MONTH,memberToMship_StartDate,memberToMship_EndDate)* memberToMship_ChargePerPeriod As totalcontractamountperiod ,
    DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS exppayments,
    30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS monthlyamount, 
    (totalcontractamountperiod/monthlyamount) as exppayments, 
    member_Id 
  FROM membertomships
) derived

У вас та же проблема с измененным кодом.Должно быть:

SELECT 
  SourceTable.Total,
  ceil(SourceTable.ExpPayments-SourceTable.Total) AS datdiff,                 
  ceil(SourceTable.ExpPayments-SourceTable.Total) -1 as diff,
  SourceTable.ExpPayments, 
  SourceTable.MonthlyAmount, 
  (SourceTable.Total/SourceTable.MonthlyAmount) as ExpPayments2, 
  SourceTable.member_Id 
FROM 
( 
  SELECT TIMESTAMPDIFF(MONTH,memberToMship_StartDate,memberToMship_EndDate)*      memberToMship_ChargePerPeriod As Total,     
  DATEDIFF(GREATEST(NOW(),memberToMship_DueDay),memberToMship_StartDate)/30 AS ExpPayments,
  30* memberToMship_ChargePerPeriod / DATEDIFF(memberToMship_EndDate,memberToMship_StartDate) AS MonthlyAmount, 
  member_Id
  FROM 
    membertomships 
) as SourceTable
...