假设我们有一些看起来像这样的数据
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的左侧(为简洁起见未包括在内)
有人可以帮助或者至少指出我正确的方向吗?我真的很感激。我已经阅读了上面的问题,而且我已经看过如何使用计数,但这真的让我感到难过。
答案 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)
)