0

私は SQL に比較的慣れていないので、これが明らかである場合は申し訳ありませんが、メイン クエリの where ステートメントで WITH 句クエリの結果を使用する方法がわかりません。私の with クエリは、各顧客の最初のレコードを取得し、そのレコードの販売日を示します。

WITH summary AS(
SELECT ed2.customer,ed2.saledate,
ROW_NUMBER()OVER(PARTITION BY ed2.customer
ORDER BY ed2.saledate)AS rk
FROM Filteredxportdocument ed2)
SELECT s.*
FROM summary s
WHERE s.rk=1

上記のクエリの日付を開始点として使用し、最初の 12 か月間、つまり販売日が ed2.saledate と ed2.saledate+12 か月の間にある各顧客のすべてのレコードを取得する必要があります。私の主なクエリは次のとおりです。

SELECT  ed.totalamountincvat, ed.saledate, ed.name AS SaleRef, 
ed.customer, ed.customername, comp.numberofemployees, 
comp.companyuid
FROM exportdocument AS ed INNER JOIN
FilteredAccount AS comp ON ed.customer = comp.accountid
WHERE (ed.statecode = 0)  AND
ed.saledate BETWEEN ed2.saledate AND DATEADD(M,12,ed2.saledate)

主なクエリを WITH 句に追加する必要があることは確かですが、どこにあるのかわかりません。誰か助けてください

4

2 に答える 2

0

これは役に立ちますか?

;WITH summary AS(
SELECT ed2.customer,ed2.saledate,
ROW_NUMBER()OVER(PARTITION BY ed2.customer
ORDER BY ed2.saledate)AS rk
FROM Filteredxportdocument ed2)

SELECT  ed.totalamountincvat, ed.saledate, ed.name AS SaleRef, 
ed.customer, ed.customername, comp.numberofemployees, 
comp.companyuid
FROM exportdocument AS ed INNER JOIN
FilteredAccount AS comp ON ed.customer = comp.accountid
OUTER APPLY (SELECT s.* FROM summary s WHERE s.rk=1) ed2
WHERE ed.statecode = 0  AND
ed.saledate BETWEEN ed2.saledate AND DATEADD(M,12,ed2.saledate)
and ed.Customer = ed2.Customer

の結果はCTEキャッシュまたは保存されないため、再利用できません。

編集:

CTE からのすべてのレコードを最終結果にする必要があるという要件に基づいて、これは新しいクエリです。

;WITH summary AS(
SELECT ed2.customer,ed2.saledate,
ROW_NUMBER()OVER(PARTITION BY ed2.customer
ORDER BY ed2.saledate)AS rk
FROM Filteredxportdocument ed2)

SELECT  
    ed.totalamountincvat, 
    ed.saledate, 
    ed.name AS SaleRef, 
    ed.customer, 
    ed.customername, 
    comp.numberofemployees, 
    comp.companyuid
FROM 
summary ed2 
left join exportdocument ed 
    on ed.Customer = ed2.Customer
    and ed.statecode = 0  
    AND ed.saledate BETWEEN ed2.saledate AND DATEADD(M,12,ed2.saledate)
INNER JOIN FilteredAccount comp 
    ON ed.customer = comp.accountid
WHERE 
     s.rk=1
于 2015-08-18T15:02:04.130 に答える
0

一度だけ使用できます。別の解決策は、要約を一時テーブルに保存し、それを何度でも使用することです。のようなもの: s.rk=1 の Summary s から #temp に * を選択します

于 2015-08-18T14:54:23.673 に答える