2016-04-06 10 views
1

を取得:私はテーブルを持っているすべての月で特定のカラムに対してnull以外の値を持つテーブルからレコード

Project_Id Period Value 

123 Jan-15 0 
123 Feb-15 34 
123 Mar-15 78 
123 Apr-15 56 
456 Jan-15 0 
456 Feb-15 0 
456 Mar-15 0 
456 Apr-15 0 
789 Jan-15 45 
789 Feb-15 4 
789 Mar-15 18 
789 Apr-15 26 

私は中値フィールドの0を持っていない場合にのみ、プロジェクトデータを取得する必要があります以下のようなすべての月:すべての月の値が、その特定のプロジェクトのために0あるので

Project_Id Period Value 
123 Jan-15 0 
123 Feb-15 34 
123 Mar-15 78 
123 Apr-15 56 
789 Jan-15 45 
789 Feb-15 4 
789 Mar-15 18 
789 Apr-15 26 

プロジェクトなし456は私の結果に来るべきではありません。

誰かが質問に手伝ってくれますか? 0 Value Sの数を決定する

答えて

1

使用SUMCOUNT

SELECT * 
FROM tbl 
WHERE project_id IN(
    SELECT project_id 
    FROM tbl 
    GROUP BY project_id 
    HAVING SUM(CASE WHEN Value = 0 THEN 1 ELSE 0 END) <> COUNT(*) 
) 

SQL Fiddle


別の解決策はEXISTSを使用することである。

SELECT * 
FROM tbl t1 
WHERE EXISTS(
    SELECT 1 FROM tbl t2 WHERE t2.project_id = t1.project_id AND t2.Value > 0 
) 

SQL Fiddle

+0

申し訳ありませんが、この作品は – TheGameiswar

+1

私はそこに自分を疑っていた、heheh。 –

0

内部選択はすべてが0ではない1つ以上のproject_idを取得します。

select * from your_table 
where project_id in 
(
    select project_id 
    from your_table 
    group by project_id 
    having sum(case when value <> 0 then 1 else 0 end) > 0 
) 
0

いくつかのテストデータが、アイデアは、私は繰り返しの値をチェックするために参加することはない好む、パフォーマンスのために同じ

create table #test123 
    (
    pid  int, 
    value int 
    ) 


    insert into #test123 
    select 1,0 
    union all 
    select 1,1 
    union all 
    select 2,0 
    union all 
    select 2,0 
    union all 
    select 3,2 


    select * from #test123 t2 where exists (select 1 from #test123 t1 
                where t1.pid=t2.pid 
                 group by pid 
                 having sum(value)>0 
              ) 
0

まま:

;WITH CTE as 
(
    SELECT 
    Project_Id, 
    Period, 
    Value, 
    max(abs(value)) over (Partition by Period) value 
    FROM YourTable 
) 
SELECT 
    Project_Id, 
    Period, 
    Value 
FROM CTE 
WHERE value > 0 

*をチェックするために腹筋を使って負の値。すべての値が正の場合、absは省略できます。

関連する問題