在空查询结果中返回零

时间:2016-06-17 10:59:20

标签: sql sql-server

我有这个问题:

SELECT 
    --DGC.Name
    [GameChannel], 
    SUM([AdjustedGames] ) *100. / SUM(SUM([AdjustedGames])) OVER()  [Percentage]
FROM #GameChannelResults1 GC
--LEFT OUTER JOIN [WarehouseMgmt].[DimGameChannel] DGC ON DGC.Name = GC.[GameChannel]
GROUP BY [GameChannel]--DGC.Name

但是当没有匹配时它会返回空结果(没有)。我想以某种方式将[WarehouseMgmt]中的所有值。[DimGameChannel] .Name作为GameChannel,如果没有匹配或结果为空,则为0表示百分比。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

也许就这样,加入你的维度,就像你已经评论过一样。

    SELECT 
        DGC.Name
        ISNULL(SUM([AdjustedGames] ) *100. / SUM(SUM([AdjustedGames])) OVER(),0)  [Percentage]
    FROM [WarehouseMgmt].[DimGameChannel] DGC
    LEFT JOIN #GameChannelResults1 GC ON DGC.Name = GC.[GameChannel]
    GROUP BY DGC.Name

答案 1 :(得分:0)

如果您在问题中添加样本数据并提供预期输出,则总会有所帮助。 SO在此主题上有一个handy guide,您可能需要阅读。

此示例有三个通道。其中两个渠道有结果,一个没有。

<强>示例

-- Table vars are easy to share.
DECLARE @Channel TABLE
    (
        ChannelName     VARCHAR(10)
    )
;

DECLARE @GameResults TABLE
    (
        ChannelName     VARCHAR(10),
        AdjustedGames   INT
    )
;

-- There are three sample channels...
INSERT INTO @Channel 
    (
        ChannelName
    )
VALUES
    ('Channel A'),
    ('Channel B'),
    ('Channel C')
;

-- ... but only two contain results.
INSERT INTO @GameResults
    (
        ChannelName,
        AdjustedGames
    )
VALUES
    ('Channel A', 1),
    ('Channel A', 2),
    ('Channel B', 1),
    ('Channel B', 2)
;

<强>查询

此查询使用outer join返回@Channel表中的每条记录以及@GameResults表中的所有匹配记录。如果没有匹配的记录,则默认返回NULL。我已使用ISNULL将其替换为0。

-- Outer join example.
SELECT
    c.ChannelName,
    ISNULL(SUM(AdjustedGames), 0)   AS AdjustedGames
FROM
    @Channel AS c
        LEFT OUTER JOIN @GameResults AS gr      ON gr.ChannelName = c.ChannelName
GROUP BY
    c.ChannelName
;

答案 2 :(得分:0)

这样的东西?

使用NULLIF功能。 它的作用类似于CASE,如果值为空,则返回null ...

NULLIF(Value,'')

然后,您可以使用ISNULLNULL值替换为0

一起使用来调整你想要的逻辑......