选择查询以在其类别(组)下具有至少一个非空值时选择行

时间:2012-12-14 10:05:40

标签: sql sql-server sql-server-2008

Table1

    CatId     Name
    1       Category1
    2       Category2
    3       Category3

Table2

FieldId     FieldName    FieldValue   Category
1            Field1        Value1        1
2            Field2        NULL          1
3            Field3        NULL          2
4            Field4        NULL          2
5            Field5        Value2        3
6            Field6        Value3        3

我有一个如上所示的表结构。当任何Fieldvalue在该类别下不为null时,我想获取类别下的字段。对于我上面的例子,结果应该是:

FieldId     FieldName    FieldValue   Category
    1         Field1        Value1        1
    2         Field2        NULL          1
    5         Field5        Value2        3
    6         Field6        Value3        3

正如您在category1中看到的,field2具有空值但仍显示。在类别2下,field3和field4都具有空值,因此不应选择它。

有人可以帮我解决上述问题的SQL查询吗?我认为的一种方法是使用groupby类别并查看count(FieldValue)> 0,其中fieldvalue不为null。但我被困在如何将这个逻辑带入sql?

提前致谢。

3 个答案:

答案 0 :(得分:4)

select *
from table2
where category in (select distinct category 
                   from table2 
                   where fieldvalue is not null)

答案 1 :(得分:2)

SELECT
    FieldId 
  , FieldName 
  , FieldValue 
  , Category
FROM 
    Table2 AS t
WHERE
    EXISTS
        ( SELECT *
          FROM Table2 AS tn
          WHERE tn.Category = t.Category
            AND tn.FieldValue IS NOT NULL
        ) ;

或:

SELECT
    t.FieldId 
  , t.FieldName 
  , t.FieldValue 
  , t.Category
FROM 
        Table2 AS t
    JOIN
        ( SELECT Category
          FROM Table2
          GROUP BY Category
          HAVING MIN(FieldValue) IS NOT NULL
        ) AS tn 
      ON tn.Category = t.Category ;

答案 2 :(得分:-1)

SELECT * FROM(

选择不同的FieldId,FieldName,FieldValue,Category 来自table1 a,table2 b 其中a.CatId = b.category )

其中fieldvalue不为null;