0
select sl.*,

       (select pnd_invoiceno 
        from   PINVDET 
        where  PND_INVNO = sl.invno and

               abs(DATEDIFF(ss, pnd_date, sl.adjustedon)) = 
               (select min(abs(DATEDIFF(ss, pnd_date, sl.adjustedon)))
                from   PINVDET
                where  pnd_invno = sl.invno))

from   vwstocklog sl where sl.invno in (select invno from vwStockDiff) 
order  by sl.invno, sl.adjustedon

上記のクエリを実行すると、次のエラーが表示されます。

外部参照を含む集計式に複数の列が指定されています。集計される式に外部参照が含まれる場合、その外部参照は、式で参照される唯一の列である必要があります。

集計で参照されてmin(abs(DATEDIFF(ss, pnd_date, sl.adjustedon)))いるため、式が問題であると言っていることを理解しています。集計式で参照されている唯一の列でない限り、そうすることができません。私がよくわからないのは、それを修正する方法です。sl.adjustedmin()

私がここでやろうとしているのは、同じ項目に最も近い値を持つpnd_invoicenoレコードの値を見つけることです (そして、これが複数のレコードにリンクする可能性があることを認識しています)。pinvdetpnd_datesl.adjustedon

それを達成するためにこのクエリを調整する方法についてのアイデアはありますか?

4

1 に答える 1

2

2 回目の試行 (最初にフィルタ):

With x as (
    select
        sl.invno,
        sl.adjustedon,
        p.pnd_invoiceno,
        rank() over (
            partition by sl.invno 
            order by abs(datediff(ss, p.pnd_date, sl.adjustedon))
       ) rk
    from
        vwstocklog sl 
            inner join
        pinvdet p
            on p.pnd_invno = sl.invno
    Where 
        Exists (
            Select
                'x'
            From
                vwStockDiff sd
            Where
                sl.invno = sd.invno
        )
)
Select
    x.invno,
    x.adjustedon,
    x.pnd_invoiceno
From
    x
Where
    x.rk = 1
order by 
    x.invno, 
    x.adjustedon

最初の試み:

With x as (
    select
        sl.invno,
        sl.adjustedon,
        p.pnd_invoiceno,
        rank() over (
            partition by sl.invno 
            order by abs(datediff(ss, p.pnd_date, sl.adjustedon))
       ) rk
    from
        vwStockDiff sd
            inner join
        vwstocklog sl 
            on sl.invno = sd.invno
            inner join
        pinvdet p
            on p.pnd_invno = sl.invno
    )
Select
    x.invno,
    x.adjustedon,
    x.pnd_invoiceno
From
    x
Where
    x.rk = 1
order by 
    x.invno, 
    x.adjustedon

等距離にある 2 つの時間がある場合、両方の行が返されます。1 のみをご希望の場合は に置き換えrank()てください。row_number()

SQLFiddle は現時点では動作していないようです。そのため、これをテストすることはできません。おそらく構文エラーがあります。

于 2013-09-27T20:52:19.900 に答える