选择列值取决于另一列的值

时间:2012-08-23 12:16:52

标签: sql-server-2008-r2

我需要生成一个报告,并将“NUMBER”列中的所有NULL值替换为1到10之间的值,具体取决于另一个“VALUE”列的值,然后将它们合计。已经包含了一些'NUMBER',但有些还没有。基本上,这就是我所拥有的 -

**NUMBER**   **VALUE**    **DATE**
NULL         Apple        2012-08-01
NULL         Pear         2012-08-01
NULL         Banana       
NULL         Apple        2012-08-02
1            Apple        
2            Pear         2012-08-04
3            Banana       2012-08-04

我需要制作的是一份显示类似内容的报告 -

**NUMBER**    **VALUE**    **TOTAL**    **DATE**
1             Apple        3            2
2             Pear         2            2
3             Banana       2            1

我遇到的问题是SQL中还有另一个COUNT,我无法想办法让一起工作。当前的SQL看起来像这样 -

SELECT    NUMBER,
          VALUE,
          COUNT (NUMBER) AS TOTAL,
          COUNT (DATE) AS DATE

FROM      MY_TABLE

GROUP BY  NUMBER,
          VALUE

感谢。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,此查询将返回您想要的总数:

WITH ValueCount AS
(
   SELECT mt.Value, COUNT(1) AS Total
   FROM #My_Table AS mt
   GROUP BY mt.Value
)
, DateCount AS
(
   SELECT mt.Value, COUNT(1) AS DateTotal
   FROM #My_Table AS mt
   WHERE mt.MyDate IS NOT NULL
   GROUP BY mt.Value
)
SELECT mt.Number, vc.Value, vc.Total, dc.DateTotal
FROM ValueCount AS vc
INNER JOIN #My_Table AS mt ON vc.Value = mt.Value
INNER JOIN DateCount AS dc ON vc.Value = dc.Value
WHERE mt.Number IS NOT NULL
ORDER BY mt.Number ASC;

由于您正在寻找不同的标准,我从日期中分解了总价值。如果您不喜欢Common Table Expression (CTE)的外观,则可以使用多个查询或子查询来完成此操作。

使用CTE时,前面的查询必须以分号结尾。