需要在FOXPRO中计算具有特定条件的记录

时间:2015-05-07 06:06:58

标签: count foxpro

我有一个非唯一名称字段的FOXPRO表,我想查询以下内容;

对于每个名称值(" John")计算有多少条记录(32条记录名为John)

4 个答案:

答案 0 :(得分:2)

SELECT name, COUNT(*) FROM table1 GROUP BY name

查询会从' 名称'中选择所有唯一值字段,并计算每个选定值的出现次数。 GROUP BY是强制性条款。它使选定的值不同。替换' table1 '带有表格文件名的DBF文件名。

答案 1 :(得分:1)

解决方案取决于您的规格 - 如果您有一些测试数据,如:

CREATE CURSOR test (id Int, FirstName Char(30) Null)
INSERT INTO test (id, FirstName) VALUES (1, "John")
INSERT INTO test (id, FirstName) VALUES (2, "Adam")
INSERT INTO test (id, FirstName) VALUES (3, "John F.")
INSERT INTO test (id, FirstName) VALUES (4, "Brian John")
INSERT INTO test (id, FirstName) VALUES (5, "Brian John David")
INSERT INTO test (id, FirstName) VALUES (6, "Johnson")

...并且假设您想要完全匹配,那么在Vfp SQL中您可以使用Like运算符(或完全相等的“==”):

SELECT COUNT(*) FROM test WHERE FirstName Like 'John' && count is 1

...而标准SQL“=”运算符将取决于VFP中的Set Ansi:

SET ANSI OFF && default
SELECT COUNT(*) FROM test WHERE FirstName = 'John' && result is 3
SET ANSI ON
SELECT COUNT(*) FROM test WHERE FirstName = 'John' && result is 1

在VFP中,标准SQL'%'占位符的行为与您预期的一样:

SELECT COUNT(*) FROM test WHERE FirstName Like 'John%' && 3
SELECT COUNT(*) FROM test WHERE FirstName Like 'John %' && 2
SELECT COUNT(*) FROM test WHERE FirstName Like '%John%' && 5

...使用“本机”Vfp DBF表无法优化最后一个,因为VFP本身没有全文索引功能

答案 2 :(得分:0)

我喜欢奥列格的回答,我同意。如果您需要运行并计算名称' John'在索引列中,您可能需要设置ANSI_NULLS ON ..

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON
GO

..这尤其对TRANSACT-SQL有帮助..顺便说一句,如果你想检查ANSI_NULLS是否设置为ON,请在代码下运行此处。

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF'; 
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON'; 
SELECT @ANSI_NULLS AS ANSI_NULLS; 

有关详细信息,请访问: - https://msdn.microsoft.com/en-us/library/ms188048.aspx

答案 3 :(得分:0)

这些答案似乎都不是纯粹的FoxPro代码。虽然使用选择查询肯定会有效,但我觉得这种类型的任务通常有点过分。

SELECT TABLE
COUNT TO {variable} FOR {CONDITION}

例如:

COUNT TO lnCount FOR "John" $ NAME

或者如果您担心表中的情况可能有所不同:

COUNT TO lnCount FOR "JOHN" $ UPPER(NAME)