2016-04-04 16 views
0

CTE ile bir sorgum var. CTE, belirli bir tarih aralığındaki birkaç tablodan veri çeker. Yapmak istediğim, bir veri aralığına sahip CTE'den bir kez seçim yapmak, daha sonra bunu ikinci bir tarih aralığına sahip CTE'ye ikinci bir çağrıya katılmaktır. Benim problemim, tarihlerin CTE'ye nasıl geçeceğini anlayamıyorum. Pyodbc kullanıyorum, iSeries OS400 makineyle konuşuyordum. MSSQL veritabanında olabildiğince değişkenler veya çoklu ifadeler kullanamıyorum. Bu, şimdiye kadar bulabildiğim tek çözüm.Tek sorguda geçiş değerleri CTE'ye mi?

Bulunduğum girişimi şöyle görünür:

WITH salesQuery AS ( 
    SELECT 
    items.imvnno AS itemNumber, 
    sum(historyTable.obqtsh) AS quantityShipped, 
    sum(historyTable.obaslp) AS sales, 
    obivdt AS actualDate, 
    obivdt AS startDate, 
    obivdt AS endDate 
    FROM aplus60fad.hsde3 historyTable 
    INNER JOIN aplus60fad.itmst items ON obitno = imitno 
    WHERE obcono = 1 
    AND obcsno = '[ID]' 
    AND actualDate BETWEEN startDate AND endDate 
    GROUP BY imvnno 
) 
SELECT 
    salesQuery_2014.itemNumber as itemNumber_2014, 
    salesQuery_2014.quantityShipped as quantityShipped_2014, 
    salesQuery_2014.sales as sales_2014, 
    salesQuery_2015.itemNumber as itemNumber_2015, 
    salesQuery_2015.quantityShipped as quantityShipped_2015, 
    salesQuery_2015.sales as sales_2015 
FROM salesQuery salesQuery_2014 
    JOIN salesQuery salesQuery_2015 on salesQuery_2014.itemNumber = salesQuery_2015.itemNumber 
WHERE salesQuery_2014.startDate = '111201' 
    AND salesQuery_2014.endDate = '141231' 
    AND salesQuery_2015.startDate = '141201' 
    AND salesQuery_2015.endDate = '150404'; 

ben "ACTUALDATE" Belirtilen tablolarda bulunmazsa bir hata alıyorum. Ne olduğundan emin değilim, çünkü, "actualDate" (hata tüm kapaklara yerleştirir, çünkü) CTE'de belirttiğim bir sütun tanımlayıcısıdır. CTE'nin altındaki sorgudan görebileceğiniz gibi iki tarih aralığı geçmek istiyorum, ancak bunu nasıl yapacağımı bilmiyorum. Yine, Pyodbc aracılığıyla bir IBM iSeries. Şimdiden teşekkürler.

+0

sen cant kullanmak takma adları nerede fıkra, alan (obivdt) kullanımı neme ... –

cevap

1

Hatanın nedeni, CTE'nizde WHERE maddesinde "actualDate" kullanıyor olmanızdır.

Bunu CTE'de yapamazsınız, çünkü "actualDate" CTE'de oluşturduğunuz bir takma addır. CTE'nin WHERE maddesindeki gerçek sütun adını (obivdt) kullanmanız gerekir.

DÜZENLEME: Ne yapmaya çalışıyorsunuz gibi görünen ne

başka bir görünüm üzerinde

, Bunu yapmanın yolu iki CTE'ler beraberdir. Bir dış sorgudan bir CTE'ye "yukarı" değerleri iletemezsiniz. CTE'nin dış sorgunuzun WHERE deyiminde kullandığınız değerlerin farkında olması için YOK YOK vardır.

yolu

psuedocode içinde, bu nasıl bir şey olduğunu İstediğiniz yapmak: yorumlar ve cevap

WITH cte2014 AS (
    CTE Query for Dates in 2014 
), 
cte2015 AS (
    CTE Query for Dates in 2015 
) 
SELECT ... 
FROM cte2014 JOIN cte2015 on {Key Column} 
+0

teşekkürler. Kendi tanımlayıcılarımın orada kullanılamayacağını fark etmeliydim. – AH16

+0

Önerilen bir yaklaşım için düzenlememe bakın. –

0

sayesinde, geçerli bir sorgu var. 'Geçerli' diyorum çünkü sözdizimsel olarak, iyi - hata yok ve çalışıyor. İşlevsel olarak, emin değilim, ama en azından hata yapmıyor. Durumda herkes doğru yolu ne arıyor: içinde

WITH salesQuery AS ( 
    SELECT items.IMVNNO AS itemNumber, sum(historyTable.OBQTSH) as quantityShipped, sum(historyTable.OBASLP) AS sales, 
    historyTable.obivdt as salesDate 
    FROM APLUS60FAD.hsde3 historyTable 
    inner join APLUS60FAD.ITMST items 
    on OBITNO = IMITNO 
    WHERE OBCONO = 1 and OBCSNO = '[ID]' 
    GROUP BY imvnno, obivdt 
) 
select salesQuery_2014.itemNumber as itemNumber_2014, salesQuery_2014.quantityShipped as quantityShipped_2014,  salesQuery_2014.sales as sales_2014, 
    salesQuery_2015.itemNumber as itemNumber_2015, salesQuery_2015.quantityShipped as quantityShipped_2015,  salesQuery_2015.sales as sales_2015 
FROM ( 
    SELECT * 
    from salesQuery 
    WHERE salesDate between '111201' and '131231' 
) salesQuery_2014 
JOIN ( 
    SELECT * 
    from salesQuery 
    WHERE salesDate between '131201' and '150404' 
) salesQuery_2015 
on salesQuery_2014.itemNumber = salesQuery_2015.itemNumber 
İlgili konular