【问题标题】:sql I don't want to lose null values when I'm using group bysql 我不想在使用 group by 时丢失空值
【发布时间】:2014-12-13 12:27:01
【问题描述】:

我正在尝试找出哪个商品访问了一个不在他的路线之外的 poi。为了做到这一点,我需要从 vp.poiid 中找到空值,但是当我进行分组时,我在该列上丢失了空值。

.
.
.
(SELECT
    vp.routedate AS Date,
    me.MerchName,
    me.id AS Merchid,
    ov.poiid AS Done,
    vp.poiid AS Planned,
    CASE WHEN ov.poiid IS NULL THEN COUNT(ov.poiid) END AS notDone,
    CASE WHEN vp.poiid IS NULL THEN COUNT(vp.poiid) END AS outOfRoute

FROM atb_visitplan vp

FULL JOIN OutVisitData ov ON (vp.poiid = ov.poiid 
AND ov.commitdate = vp.routedate 
AND vp.merchid = ov.merchid)

INNER JOIN atb_merchs me ON (vp.merchid = me.id)

WHERE me.id = 1  
GROUP BY 
    vp.routedate,
    me.MerchAd,
    me.id,
    ov.poiid,
    vp.poiid
) a
.
.
.

当我运行这个子查询时,我得到了这个视图:

     date                 name      id  done   planned  notdone  outofroute
2013-11-06 00:00:00.000 Seven Kavak 1   30      30      0       NULL
2013-11-06 00:00:00.000 Seven Kavak 1   34      34      0       NULL
2013-11-06 00:00:00.000 Seven Kavak 1   48      48      0       NULL
2013-11-06 00:00:00.000 Seven Kavak 1   54      54      0       NULL
2013-11-06 00:00:00.000 Seven Kavak 1   NULL    1235    1235    NULL
2013-11-06 00:00:00.000 Seven Kavak 1   NULL    1236    1236    NULL
2013-11-07 00:00:00.000 Seven Kavak 1   30      30      0       NULL
2013-11-07 00:00:00.000 Seven Kavak 1   49      49      0       NULL

正如您在此结果中看到的,outOfRoute 的值全部为 NULL(但实际上并非如此)。有什么办法可以看到这张表中的实际结果?我需要对这些列进行分组,这是一个子查询,我计算最终结果。计划列实际上有空值,但我也看不到它们。

PS:我用的是sql server

【问题讨论】:

    标签: sql sql-server null group-by


    【解决方案1】:

    我想我第一次看错了。您想要计算那些为空的记录,对吗?

    COUNT(SELECT * FROM ov WHERE ov.poiid IS NULL) AS notDone,
    COUNT(SELECT * FROM vp WHERE vp.poiid IS NULL) AS outOfRoute
    

    您当前的语句说,“当分组字段为空时显示这些记录的计数”,看起来从来没有。

    您需要重新定义这些选择中的连接;我为了简洁起见。

    (改写了,我希望有更好的答案。)

    【讨论】:

    • 不,它找不到任何空值,我用 ROLLUP 进行了类似 GROUPING(vp.poiid) 的操作,但这次它带来了毫无意义的记录
    • 你说得对,实际上我必须找到另一种不丢失空值的方法。
    【解决方案2】:

    您的 CASE WHEN vp.poiid IS NULL THEN COUNT(vp.poiid) END AS outOfRoute 语句仅在 vp.poiid 为 null 并且您没有 else 部分时才计算在内。如果我检查结果,您的所有vp.poiid AS Planned 列都有值,那么显然您将在outOfRoute column 中获得空值。

    【讨论】:

    • 我不需要其他部分,我尝试计算空值,但问题是当我进行分组时空值丢失。
    • 我没找到你!!你是想说当你分组时空值在 vp.poiid 列中丢失了
    • 是的,我就是这么说的
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多