0

ff を返すクエリが必要です。

  1. 各名前の最新の日付から数えます
  2. Count from the latest Date の値が -1 の場合、最新の Date より前の Date のカウントが返されます。
  3. 最新の Date からの Count の値が -1 で、もう一方の Date が -1 の場合。その後、0 を返します
  4. 最新の Date からの Count の値が -1 で、その Name の Date が他にない場合。その後、0 を返します

例の表:

ID  Name  Date         Count
1   Adj   09/29/2012   2
2   Adj   09/30/2012   4
3   Ped   09/29/2012  -1
4   Ped   09/30/2012   5
5   Mel   09/29/2012   3
6   Mel   09/30/2012  -1
7   Rod   09/30/2012   7
8   Ney   09/30/2012  -1
9   Jin   09/29/2012  -1
10  Jin   09/30/2012  -1

望ましい出力:

Name   Count
Adj    4
Ped    5
Mel    3
Rod    7
Ney    0
Jin    0

単純なクエリしか知らなかったので、SQL でこれにアプローチする方法について非常に混乱しています。

これに対するクエリを作成する方法について何か考えはありますか? ありがとう。

ところで、申し訳ありませんが、これを含めるのを忘れていました。SQL Server 2000 を使用しています。

4

2 に答える 2

5

これを試して

SQL フィドルの例

select A.name, isnull(T.[Count], 0) as [Count]
from (select distinct T.name from table1 as T) as A
    outer apply 
    (
        select top 1 T.[Count]
        from table1 as T
        where T.name = A.name and T.[Count] <> -1 
        order by T.[date] desc
    ) as T
order by A.name asc

UPDATE : SQL 2000 の場合、次のようなクエリを使用できます

SQL 2000 のSQL FIDDLE の例

select A.name, isnull(T1.[Count], 0) as [Count]
from 
(
    select T.name, max(case when T.[Count] <> -1 then T.[date] else null end) as [date]
    from table1 as T
    group by T.name
) as A
    left outer join table1 as T1 on T1.name = A.name and T1.[date] = A.[date]

name, [date]ただし、列に一意の制約があるという提案に依存しています

于 2012-11-02T07:39:30.787 に答える
1

もう一つ

Select * from
(
Select Test.name,[Count]
from TEST
Join(
Select name, MAX(Date) as Date from TEST  
where [Count]<>-1
Group by Name) a
on a.Name=test.Name and a.Date=Test.Date
UNION 
Select Distinct name,0 from test o where not Exists(Select * from test where name=o.Name and [count]<>-1)
) res
order by Name
于 2012-11-02T07:53:42.533 に答える