【问题标题】:Display zero value in field when query output is null查询输出为空时在字段中显示零值
【发布时间】:2021-04-08 10:03:10
【问题描述】:

约翰·格雷买了多少手电筒?

这是我需要达到的结果:

到目前为止,我有这个:

IF NOT (EXISTS (SELECT 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    FROM [dbo].[customers] AS c 
    INNER JOIN [dbo].[Customer_Purchases] AS cp
    ON c.[customerid] = cp.[customerid]
    WHERE 
        c.[customerid] = 10101
        AND cp.[item] = 'Flashlight'
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    )
)BEGIN
    SELECT
        c.[customerid] AS ID,
        c.[firstname] AS First Name, 
        c.[lastname] AS Last Name,
        'Flashlight' AS Item,
        '0' As Quantity
    FROM [dbo].[customers] AS c
    WHERE 
        c.[customerid] = 10101
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname]
END

更实用的方法是什么?

我已经处理了几个关于此类问题的 SO 线程(thisthisthisthis),但必要的JOIN 似乎对我来说太复杂了。

编辑 1:

  1. 更正了代码中的不一致之处;
  2. 提供了指向 SO 线程的超链接。

【问题讨论】:

  • " 因为我在尝试时出现了各种错误" 这些错误是什么?
  • @Larnu 我想反对票是针对错误部分的。你想让我把它们列出来,或者编辑问题以恢复反对票?
  • “我想对错误部分投反对票。” 这不是我的,所以我不知道我害怕。可能有多种原因,包括说您遇到了错误,但没有告诉我们该错误是什么。当人们说“我在Stack Overflow 上查看各种帖子”时,有很多用户不喜欢它,但也不要引用它们。但是,我不能恢复我没有投下的反对票;只有选民才能做到这一点。
  • @Larnu,我已经对问题进行了一些更正,因为它们的必要性已被指出。无法提供错误消息。因为他们当时没有收集它们。如果有办法从日志中提取它们,请告诉我。

标签: sql tsql sql-server-2008


【解决方案1】:

约翰·格雷买了多少手电筒?

只需使用left join:

SELECT c.[customerid], c.[firstname], c.[lastname], 
       COALESCE(SUM(cp.quantity), 0)
FROM dbo.customers c LEFT JOIN
     dbo.Customer_Purchases cp
     ON c.customerid = cp.customerid AND
        cp.item = 'flashlight'
WHERE c.customerid = 10101
GROUP BY c.[customerid], c.[firstname], c.[lastname];

注意:您不想按数量汇总。大概,您想将手电筒的所有数量相加。并且手电筒上的过滤(而不是客户)需要在ON 子句中,因为购买是LEFT JOIN 中的第二个表。

【讨论】:

    【解决方案2】:
    SELECT c.[customerid], c.[firstname], c.[lastname],
           sum(case when cp.item = 'flashlight' then cp.quantity else 0 end)
    FROM dbo.customers AS c 
    LEFT JOIN dbo.Customer_Purchases AS cp ON c.customerid = cp.customerid
    WHERE c.customerid = 10101
    GROUP BY c.[customerid], c.[firstname], c.[lastname]
    

    【讨论】:

    • 抱歉,@Gordon Linoff 更快。我仍然喜欢这种方法。
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 2013-05-29
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多