顺序列 - 条件 - SQL / Access

时间:2012-08-10 12:28:58

标签: sql ms-access count

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

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

这是我试图过滤的相邻数字太少的情况。我需要计算那些特定列中相邻(或每隔一个!)数字的数量。

我看过这个问题:Multiple Column Conditional Count SQL,但我不认为我可以使用Count(*),因为我收到此错误:您试图执行一个不包含speicified表达式的查询'有一定风险?'作为集合功能的一部分。风险是一个只存储是/否的列,并且位于R_Id的左侧(为简洁起见未包括在内)

有人可以帮助或者至少指出我正确的方向吗?我真的很感激。我已经阅读了上面的问题,而且我已经看过如何使用计数,但这真的让我感到难过。

3 个答案:

答案 0 :(得分: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解决方案。

答案 1 :(得分: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);

答案 2 :(得分: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) 
)