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 语句仅显示行需要进一步调查的行。这是通过说“哪里有两个以上的大数连续相邻?” 所以我需要计算数量很大的行数。

输出应该看起来像这样,我已经解释了我正在做什么过滤。

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?”的查询 作为聚合函数的一部分。有风险的是仅存储是/否并位于 R_Id 左侧的列(为简洁起见,未包括在上面)

任何人都可以帮助或至少指出我正确的方向吗?我真的很感激。我已经阅读了上面的问题,并且查看了一般如何使用 count ,但这真的难倒我。

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 回答