-4

このコードでエラーが発生する理由を教えてください。

 SqlCommand scGetClaimedDetails = new SqlCommand(
    "SELECT SUM(isclaimable) as claimable, SUM(isclaimed) as claimed,SUM(total) as total from" +
    " ( SELECT CASE WHEN claimed = 'Y' THEN inv_amt *.45 END as isclaimed, (inv_amt *.45) as inclaimable, inv_amt as total from invasset" +
    " INNER JOIN Invoice ON invoice.invoice = invasset.invoice WHERE invasset.asset_no = @AssetNumber ) as D2", DataAccess.AssetConnection);
4

3 に答える 3

1

サブクエリで、inv_amt 列がどこから来ているかを指定します (invoice.inv_amt か invasset.inv_amt か)。

于 2012-07-12T13:07:23.887 に答える
1

あいまいな列名 inv_amt

それは 2 つのテーブルのように縫い合わされてinvassetおり、Invoiceどちらにも column が含まれていますinv_amt。内側のSELECTステートメントでエイリアスを参照する必要があります。たとえば、:invoice.inv_amtまたはinvasset.inv_amt:

SELECT SUM(isclaimable) as claimable, SUM(isclaimed) as claimed, 
       SUM(total) as total 
FROM
( 
   SELECT CASE WHEN claimed = 'Y' THEN invoice.inv_amt *.45 END as isclaimed, 
   (inv_amt *.45) as  inclaimable, inv_amt as total 
   from invasset INNER JOIN Invoice  ON invoice.invoice = invasset.invoice 
   WHERE invasset.asset_no = @AssetNumber 
) as D2
于 2012-07-12T13:08:26.667 に答える
0

あなたのコードを人間が読めるようにフォーマットすると...

SqlCommand scGetClaimedDetails = new SqlCommand(
    "SELECT
         SUM(isclaimable) AS claimable,
         SUM(isclaimed) AS claimed,
         SUM(total) AS total
     FROM
         (SELECT
              CASE WHEN claimed = 'Y' THEN inv_amt *.45 END AS isclaimed,
              (inv_amt *.45) AS inclaimable,
              inv_amt AS total
          FROM
              invasset
              INNER JOIN Invoice ON invoice.invoice = invasset.invoice
          WHERE
              invasset.asset_no = @AssetNumber) AS D2",
    DataAccess.AssetConnection);

SELECT外側が という列を探しているのにisclaimable、内側SELECTが という列を返していることに気が付かずにはいられませんinclaimable。コードにタイプミスがあります。

編集:質問に対するあなたのコメントに応えて、どのテーブルにフィールドが含まれていますinv_amtか? 明らかに、それを持つ 2 つのテーブルを参照しています。参照している唯一のテーブルはinvassetInvoice明らかに両方のテーブルに という名前の列があるためinv_amtです。クエリで必要なものを指定する必要があります。

したがって、代わりに:

`inv_amt AS total`

次のようなものが必要です。

`invasset.inv_amt AS total`

(それが必要なテーブルであると仮定すると、それ以外の場合は他のテーブルを使用します。)

于 2012-07-12T13:09:05.833 に答える