0

私はこのようなクエリを書きましたが、これらの結果をさらに計算して、すべてを単一のクエリにまとめたいと思います

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

これは変更されたクエリであり、クエリにさらに2つの関数を追加しましたが、エラーが発生していました

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」

4

2 に答える 2

1

一部の列名は少し長いので省略します。これにより、クエリがより明確になります。

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; 

それらを定義する同じ列リストでTotalandを使用しているため、問題は指摘された行にあります。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. サブクエリのように式を作り直します。計算は 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

ところで、元のクエリの 2 つの列の名前は ExpPayments で、2 番目の列の名前を ExpPayments2 に変更しました。

于 2011-07-07T09:15:34.390 に答える
1
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
于 2011-07-07T09:10:21.420 に答える