顺序列当条件 - SQL /访问(Sequential Column Where Conditio

2019-10-17 03:46发布

假设我们有一些数据,看起来像这样

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

而假设我们有比上面多了很多栏目,但我们已经仅限于少数几个现在。

我希望能够使用其中statment为只显示行其中行需要进一步调查。 这是说做“凡在一排有两个以上的大数彼此相邻的?” 所以,我需要计算的行数,其中数量较大。

输出应该像这样,在那里我已经解释了我在做什么过滤。

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"

这是那里有我试图筛选太少相邻号码的情况。 我需要计算相邻(或隔日!)号码的NUMER在那些特定的列。

我看这个问题: 多列条件计数SQL ,但我不认为我可以使用COUNT(*),因为我得到这个错误:“?AT_RISK”你试图执行一个查询thaty不包括speicified表达 作为骨料功能的一部分。 在风险在于,只存储是/否和生命R_ID左侧(不包括上面简洁)列

任何人都可以帮助或至少指向我朝着正确的方向吗? 我会很感激。 我读过上面的问题,我已经看了如何使用一般数,但这次是真的绊倒了我。

Answer 1:

嗯,我能想到的一个有点丑陋的解决了这个问题,而是牵涉到使用定制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的解决方案,我能想到的。



Answer 2:

你说:“超过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);


Answer 3:

尝试这个

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) 
)


文章来源: Sequential Column Where Conditional - SQL / Access