如何在使用group by子句时选择额外的列?

时间:2014-05-03 12:58:29

标签: sql sql-server

我有一个包含此格式数据的表格。

productid     filterName         boolfilter            numericfilter
   1               X                 1                      NULL    
   1               Y                NULL                    99inch 
   1               Z                 0                      NULL
   2               Y                NULL                    55kg
   2               Y                NULL                    45kg
   3               K                NULL                    20
   3               M                NULL                    35
   3               N                NULL                    25
   4               X                 1                      NULL
   4               K                 1                      NULL

我需要这种格式的数据。 Need products where only numeric filters are setup but no boolean filters

productid    filterName       numericfilter
   2          Y                 55kg
   2          Y                 45kg
   3          K                 20
   3          M                 35
   3          N                 25

我写了这个查询,

 SELCT  productid
 FROM   tbl_filters
 GROUP BY    productid
 HAVING SUM(CAST(boolfilter AS INT)) IS NULL

我正在获得prouctid 2和3,但我还需要额外的列,正如我所提到的。 当我在groupby子句中使用多个列时,我没有得到所需的输出。

2 个答案:

答案 0 :(得分:3)

SELECT t.productid, t.filterName, t.numericfilter
FROM Table_Name t
WHERE t.numericfilter IS NOT NULL
AND NOT EXISTS (SELECT 1
                FROM TABLE_NAME 
                WHERE t.productid = productid
                AND boolfilter IS NOT NULL)

Working SQL FIDDLE

    | PRODUCTID | FILTERNAME | NUMERICFILTER |
    |-----------|------------|---------------|
    |         2 |          Y |          55kg |
    |         2 |          Y |          45kg |
    |         3 |          K |            20 |
    |         3 |          M |            35 |
    |         3 |          N |            25 |

答案 1 :(得分:2)

改为使用窗口函数:

 SELECT productid, filterName, numericfilter
 FROM (SELECT f.*,
              MAX(boolfilter) OVER (PARTITION BY productid) as maxbf
       FROM tbl_filters f
      ) f
 WHERE maxbf is null;

Fiddle DEMO

这会计算每个boolfilter的{​​{1}}的最大值。如果始终为productid,则结果为NULL。请注意,您不需要NULL