2017-04-18 8 views
0

私は、ネストされたサブクエリから列を取得する必要があるストアプロシージャを持っています。私は一度ネストされていればそれを得る方法を知っていますが、この状況では、私が表示する必要がある列は二重に入れ子になっています。左結合のネストされたサブクエリから列を取り出す方法は?

SELECT a.vendor, 
a.last, 
MaxInv 
FROM 
    (
    SELECT vendor, day 
    FROM tblvendor) a 

    LEFT JOIN (SELECT vendor, tblarinv.arinv, tblardetail.arddate 
    Sum([MaxQty]*[ActualCost]) AS MaxInv, 
    FROM tblarinv 
    INNER JOIN tblardetail 
    ON tblarinv.id= tblardetail.id)  
group by a.vendor,a.last 

上記の例では、左から2列を取得する必要があります。LEFT JOIN (SELECT vendor,tblarinv.arinv, tblardetail.arddate。もともとselectステートメントにはベンダーしかありませんが、tblarinv.arinv, tblardetail.arddateが必要なので、左側のjoinステートメントのselectステートメントに追加しました。そして、このフィールドを最初のSELECTステートメントに追加しようとすると、 '複数のパートの識別子をバインドできませんでした'というエラーが表示されます。 誰か助けてくれますか?

SELECT 
a.Vendor, 
,CASE WHEN sum(GP)<>0 THEN GP ELSE 0 END GP 
,a.ThreeMonths 
,CASE WHEN sum(GP)<>0 THEN GP/@WorkDaysElapsed ELSE 0 END AS AvgDailyGP 
,CurrentInv 
,MaxInv 
,Inventory_Variance 

FROM 
(Select Vendor, sum(GrossProfit) ThreeMonths, 
    (Select sum(GrossProfit) From dbo.MonthlySales with (nolock) Where EndOfMonth Between dateadd(m,-3,@First) and @First-1) as AllThreeMonths 
    FROM MonthlySales with (nolock) 
    Where EndOfMonth>=dateadd(m,-3,@First) 
    Group By Vendor 
    Having sum(GrossProfit)<>0) a 

LEFT JOIN (Select tblMaterial.Vendor, tblARDetail.ARInvoiceID, tblARDetail.ARInvoiceDetailID, tblARInv.ARInvoiceDate 
,(Sum(SplitAmount))-(Sum((CASE WHEN SplitAmount<0 THEN -1*ABS([Quantity]) ELSE ABS([Quantity]) END)*dbo.fn_CalculatePrice_Decimal(tblARDetail.UnitCost,tblARDetail.ProductDiscountPct))) AS GP 

      FROM tblARInv with (nolock) 
      INNER JOIN tblARDetail with (nolock) ON tblARDetail.ARInvoiceID = tblARInv.ARInvoiceID 
      INNER JOIN tblMaterial with (nolock) ON tblMaterial.MaterialID = tblARDetail.MaterialID 
      INNER JOIN [dbo].[tblCust] 
       ON [tblCust].[CustomerID] = [tblARInv].[CustomerID] 
      Where tblARInv.Date>= '' + cast(Month(GetDate()) as varchar(2)) + '/1/' + cast(year(GetDate()) as varchar(4)) + '' 
       AND [tblCust].[Status] != 8 --Internal 
      Group By tblMaterial.Vendor, tblARDetail.ARInvoiceID, tblARDetail.ARInvoiceDetailID, tblARInv.ARInvoiceDate) 
      ThisMonth ON ThisMonth.Vendor=a.Vendor 


Group By 
a.Vendor 
,GP 
,a.ThreeMonths 
,AllThreeMonths 
,CurrentInv 
,MaxInv 
,Inventory_Variance 
END 

だから、私は私が編集したクエリの上に追加されたtblARDetail.ARInvoiceID, tblARDetail.ARInvoiceDetailID, tblARInv.ARInvoiceDateを取得する必要があります。

は、ここに私の編集したクエリです。

+1

クエリは右全く見ていないこと。どこから来ているのですか? 'a'と' left join'の後の名前のない派生テーブルの結合はどこですか?名前のない派生テーブルの内部ではなく、その外に集約するのはなぜですか?派生テーブルのベンダーはどこですか? – SqlZim

+0

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

@SqlZim:私のクエリは複雑なので、私は簡単な例を挙げようとしました。申し訳ありませんが、コードを正しく編集しようとしています。 – toofaced

答えて

1

サンプルクエリには多くの問題がありますが、最初の部分は、結合を "入れ子にする"必要がない場合です。 (これは、一部の人々がMicrosoft Accessから拾う悪い習慣で、あなたはそのような混乱を使わなければならない)。接合された編集済みの質問から

select 
    v.vendor 
    , v.last 
    , sum(d.[MaxQty]*d.[ActualCost]) as MaxInv 
from tblvendor v 
    left join tblarinv i 
    on v.vendor = i.vendor 
    left join tblardetail d 
    on i.id= d.id 
group by v.vendor, v.last 

それらの列がネストされているように、それは見ていない、彼らはThisMonthでご利用いただけます:疑似クエリは、このようなものにまで単純化することができ

あなた

aになります。

select 
    a.Vendor 
    , case when sum(GP) <> 0 then GP else 0 end GP 
    , a.ThreeMonths 
    , case when sum(GP) <> 0 then GP/@WorkDaysElapsed else 0 end as AvgDailyGP 
    , CurrentInv 
    , MaxInv 
    , Inventory_Variance 
    /* Include the desired columns in the select */ 
    , ThisMonth.ARInvoiceID 
    , ThisMonth.ARInvoiceDetailID 
    , ThisMonth.ARInvoiceDate 
from (
    select 
     Vendor 
    , sum(GrossProfit) ThreeMonths 
    , (
     select sum(GrossProfit) 
     from dbo.MonthlySales with (nolock) 
     where EndOfMonth between dateadd(month, - 3, @First) and @First - 1 
    ) as AllThreeMonths 
    from MonthlySales with (nolock) 
    where EndOfMonth >= dateadd(month, - 3, @First) 
    group by Vendor 
    having sum(GrossProfit) <> 0 
) a 
left join (
    select 
     tblMaterial.Vendor 
    , tblARDetail.ARInvoiceID 
    , tblARDetail.ARInvoiceDetailID 
    , tblARInv.ARInvoiceDate 
    , (Sum(SplitAmount)) 
     - (Sum((case when SplitAmount < 0 then - 1 * ABS([Quantity]) else ABS([Quantity]) end) * dbo.fn_CalculatePrice_Decimal(tblARDetail.UnitCost, tblARDetail.ProductDiscountPct))) 
     as GP 
    from tblARInv with (nolock) 
    inner join tblARDetail with (nolock) 
    on tblARDetail.ARInvoiceID = tblARInv.ARInvoiceID 
    inner join tblMaterial with (nolock) 
    on tblMaterial.MaterialID = tblARDetail.MaterialID 
    inner join [dbo].[tblCust] 
     on [tblCust].[CustomerID] = [tblARInv].[CustomerID] 
    where [tblCust].[Status] != 8 --Internal 
    -- and tblARInv.date >= '' + cast(Month(GetDate()) as varchar(2)) + '/1/' + cast(year(GetDate()) as varchar(4)) + '' 
    /* easier way to get start of the month */ 
    and tblARInv.date >= dateadd(month, datediff(month, 0, getdate()) , 0) 
    group by tblMaterial.Vendor 
    , tblARDetail.ARInvoiceID 
    , tblARDetail.ARInvoiceDetailID 
    , tblARInv.ARInvoiceDate 
) ThisMonth on ThisMonth.Vendor = a.Vendor 
left join (
select Vendor 
    , Sum(case when [InStock] > [MaxQty] then [MaxQty] * [ActualCost] else [Instock] * [ActualCost] end) as CurrentInv 
    , Sum([MaxQty] * [ActualCost]) as MaxInv 
    , ((Sum(case when [InStock] > [MaxQty] then [MaxQty] * [ActualCost] else [Instock] * [ActualCost] end)/Sum(case when [MaxQty] * [ActualCost] <> 0 then [MaxQty] * [ActualCost] else 1 end)) - 0.75)/0.75 as Inventory_Variance 
from tblMaterial with (nolock) 
where (((MaxQty) > 0)) 
group by Vendor 
) as Inventory on Inventory.Vendor = a.Vendor 
group by 
    a.Vendor 
    , GP 
    , a.ThreeMonths 
    , AllThreeMonths 
    , CurrentInv 
    , MaxInv 
    , Inventory_Variance 
    /* Include the desired columns in the group by too */ 
    , ThisMonth.ARInvoiceID 
    , ThisMonth.ARInvoiceDetailID 
    , ThisMonth.ARInvoiceDate 
end 

参考:

+0

投稿で私の質問を編集しました。擬似質問に感謝します。しかし、それは私の問題では二重のネストされたクエリです。 xQbertごとに複数レベルの場合はアクセスできません。 – toofaced

+0

@toofacedあなたの実際のクエリであなたの編集のための私の答えを更新しました – SqlZim

+0

はい私はそれらを再び通過したときにそれを実現しました。ご協力いただきありがとうございます。 – toofaced

関連する問題