1

私はこのVB(名前char(25)、金額numeric(6)、ret_date日付)のようなテーブルを持っています:

Name  Amount  Ret_date
----  ------  --------
abc    500    2011-01-21
def    200    2011-01-20
ghi   1000    
xyz    800    2011-01-22
def    200    
def    400    2011-02-01
pqr   2100    2011-02-12  
abc   3000    
abc   4100
xyz    700    2011-01-22

私が欲しかったのは(個別の名前のret_dateに基づくカウント:合計カウント、リターンカウント、保留中のカウント):

Name    tc  rc  pc 
abc     3   1   2 
def     3   2   1 
xyz     2   2   0 
ghi     1   0   1 
pqr     1   1   0

次のクエリを試しましたが、何も機能しませんでした。

SELECT vb.name, COUNT(*) tc, r.rc, p.pc FROM vb, ;
 (SELECT name, COUNT(*) rc FROM vb WHERE ret_date != {} group BY name) r, ;
 (SELECT name, COUNT(*) pc FROM vb WHERE ret_date = {} group BY name) p ;
 GROUP BY vb.name ORDER BY tc desc
SELECT vb.name, COUNT(*) tc, r.rc, p.pc FROM vb ;
  LEFT JOIN (select name, COUNT(*) rc FROM vb WHERE ret_date != {} group BY name) r ON r.name = vb.name ;
  LEFT JOIN (select name, COUNT(*) pc FROM vb WHERE ret_date = {} group BY name) p ON p.name = vb.name ;
  GROUP BY vb.name
SELECT vb.name, COUNT(*) tc, r.rc, p.pc FROM vb ;
  LEFT JOIN (select r.name, COUNT(*) rc FROM vb r WHERE ret_date != {} group BY name) r ON r.name = vb.name ;
  LEFT JOIN (select p.name, COUNT(*) pc FROM vb p WHERE ret_date = {} group BY name) p ON p.name = vb.name ;
  GROUP BY vb.name

3つの個別のクエリ(合計カウント、ret_dateのカウント= {}、ret_date!= {})でカウントを取得できましたが、単一のクエリを使用して同時に取得することはできません。希望の出力を得るのを手伝ってください。私はSQLに不慣れで、基本を理解できますが、結合やサブクエリなどはまだ理解しにくいです。クエリの機能を説明できれば助かります。

注:私はMS Visual Foxpro 9.0(Windows 7)を使用しています。{}は、Foxproで日付型の空を表すために使用される表記であり、!=は演算子と等しくありません。

どうもありがとう。

4

2 に答える 2

3
SELECT name, COUNT(DISTINCT name) as uc, COUNT(*) as tc, SUM(IF(ret_date IS NULL, 0, 1)) as rc, SUM(IF(ret_date IS NOT NULL, 0, 1)) as pc
FROM vb
GROUP BY name;

Foxproにアクセスできませんが、これはMySQLで機能します。うまくいけば、あなたはあなたの目的に合うようにそれを微調整することができます。

于 2012-07-04T20:14:30.203 に答える
0

私は Foxpro の経験がありませんがCOUNT(*)、あなたの合計数COUNT(Ret_Date)を与え、保留中の数を与えると思います (null 値をカウントしないため)。次に、COUNT(*) - COUNT(Ret_Date)(tc - rc) は保留中のカウントを示します。これにより、サブクエリが不要になる場合があります (カウント時に VFP が他の DBMS のように動作する場合)。

SELECT Name, COUNT(*) tc, COUNT(Ret_Name) rc,  COUNT(*) - COUNT(Ret_Name) pc
FROM VB
GROUP BY Name;
于 2012-07-04T22:30:10.693 に答える