Sql 在空查询结果中返回零

Sql 在空查询结果中返回零,sql,sql-server,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] GRO

我有一个疑问:

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

但如果没有匹配项,则返回空结果(无)。我想以某种方式将[WarehouseMagmt].[DimGameChannel]中的所有值命名为GameChannel,如果没有匹配项或结果为空,则将百分比命名为0。我该怎么做呢?

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

    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

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

    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

如果您在问题中添加示例数据,并提供预期的输出,这总是有帮助的。关于这个话题,你可能想读一读

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

样本

-- 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)
;
查询

此查询使用返回
@Channel
表中的每条记录以及
@GameResults
表中的任何匹配记录。当没有匹配的记录时,默认情况下返回NULL。我曾经用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
;

如果您在问题中添加示例数据,并提供预期的输出,这总是有帮助的。关于这个话题,你可能想读一读

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

样本

-- 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)
;
查询

此查询使用返回
@Channel
表中的每条记录以及
@GameResults
表中的任何匹配记录。当没有匹配的记录时,默认情况下返回NULL。我曾经用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
;
像这样的

使用
NULLIF
函数。 它的工作原理类似于
CASE
,如果值为空,则返回null

NULLIF(Value,'')
然后可以使用
ISNULL
NULL
值替换为
0

一起使用来调整所需的逻辑…

类似的内容

使用
NULLIF
函数。 它的工作原理类似于
CASE
,如果值为空,则返回null

NULLIF(Value,'')
然后可以使用
ISNULL
NULL
值替换为
0


一起使用可调整所需的逻辑…

谢谢,这很有帮助。正确的JOIN和ISNULL是解决方案谢谢,这很有帮助。右JOIN和ISNULL是解决方案