1

そのように見えるいくつかのデータがあるとします

R_Id    Nm      Base       Dest    Proj      Cust_id  201203   201202   201201
MRBR    Bob     LONDON     UK      Project1  1        0        0        0
MRBU    Frank   LONDON     London  Project2  2        11.68    0        248.93
MRBU    Frank   LONDON     UK      Project3  1        7.4      4.8      0
MRGB    Barry   GUILDFORD  Hull    Project4  1        50.36    12.85    48.92
MRGB    Barry   GUILDFORD          Project5  1        0        177.31   0
MRGB    Barry   GUILDFORD  INTL    Project6  3        0        331.08   0

上記よりもはるかに多くの列があるとしますが、今のところ少数に限定しています。

where ステートメントを使用して、さらに調査が必要な行のみを表示できるようにしたいと考えています。これは、「2 つ以上の大きな数字が連続して並んでいる場所はどこですか?」ということによって行われます。したがって、数が多い行の数を数える必要があります。

出力は次のようになります。ここで、行っているフィルタリングについて説明しました。

R_Id    Nm      Base       Dest    Proj      Cust_id  201203   201202   201201
MRBR    Bob     LONDON     UK      Project1  1        "Numbers not Large"
MRBU    Frank   LONDON     London  Project2  2        11.68    248.93   0   
MRBU    Frank   LONDON     UK      Project3  1        "Numbers not Large"
MRGB    Barry   GUILDFORD  Hull    Project4  1        50.36    12.85    48.92
MRGB    Barry   GUILDFORD          Project5  1        "Too few adjacent numbers"
MRGB    Barry   GUILDFORD  INTL    Project6  3        "Too few adjacent numbers"

フィルタリングしようとしている隣接する数字が少なすぎる場合です。これらの特定の列の隣接する (または他のすべての) 数字の数を数える必要があります。

この質問を見てきました: Multiple Column Conditional Count SQLですが、次のエラーが発生するため、 Count(*) を使用できないと思います: 指定された式 'AT_RISK?' が含まれていないクエリを実行しようとしました。集計関数の一部として。危険にさらされているのは、Yes/No のみを格納し、R_Id の左側にある列です (簡潔にするために上記には含まれていません)。

誰か助けてくれますか、少なくとも私を正しい方向に向けてください。本当にありがたいです。上記の質問を読み、一般的なカウントの使用方法を見てきましたが、これは本当に困惑しています。

4

3 に答える 3

2

この質問に対するやや醜い解決策を思いつくことができますが、カスタム VBA 関数を使用する必要があります。

文字列の連結とテスト

SQL ステートメントは次のようになります。

SELECT * FROM tblName 
WHERE IsSeqHigh([201203] & ";" & [201202] & ";" & ..., 1000);

次に、VBA モジュールで次のように定義します。

Public Function IsSeqHigh(seq As String, thres As Double) As Boolean
    IsSeqHigh = False

    Dim valStrs() As String
    valStrs = Split(seq, ";")

    For n = 1 To UBound(valStrs) - 1
        If (valStrs(n) >= thres) And (valStrs(n + 1) >= thres) Then
            IsSeqHigh = True
            Exit For
        End If
    Next n
End Function

別のアプローチ

または、スキーマが固定されていて変更される可能性が低く、主キーの値がある場合は、主キーの値を取得し、探している特定の条件について列をスキャンする VBA 関数を作成できます。

要するに、私が考えることができる良い SQL のみのソリューションはありません。

于 2012-08-10T14:26:58.933 に答える
1

「1000 を超える注文」と言いましたが、出力から Pjt_Id = 1 を除外する必要があります。実際に少なくとも 1000 の注文が必要な場合は、このクエリを に変更>します。>=

SELECT
    p.Pjt_Id,
    p.OrderPriceQ1,
    p.OrderPriceQ2,
    p.OrderPriceQ3,
    p.Customer
FROM TblPureferret AS p
WHERE
       (p.OrderPriceQ1 > 1000 AND p.OrderPriceQ2 > 1000)
    OR (p.OrderPriceQ2 > 1000 AND p.OrderPriceQ3 > 1000);
于 2012-08-10T13:03:06.520 に答える
0

これを試して

select 
    Pjt_Id  ,OrderPriceQ1 ,OrderPriceQ2 ,OrderPriceQ3 ,Customer  
from 
    table
where 
(
    (OrderPriceQ1>=1000 and OrderPriceQ2 >=1000) or
    (OrderPriceQ1>=1000 and OrderPriceQ3 >=1000) or
    (OrderPriceQ2>=1000 and OrderPriceQ3 >=1000) 
)
于 2012-08-10T13:02:13.543 に答える