DB2 SQL Count over Union of multiple tables with different Datatype

Posted

技术标签:

【中文标题】DB2 SQL Count over Union of multiple tables with different Datatype【英文标题】: 【发布时间】:2019-09-06 04:36:12 【问题描述】:

我想合并多个表,其中一些想计数。

Select A.CustomerId
      , A.CustomerGroup
      , ‘’        as count
From Customer A
Union 
Select  B.CustomerId
      , B.CustomerGroup
      , select(count(*) from Product C
                   Where C.productId = B.productId) as count
From Product B

出现集合运算符的操作数的第 3 列不兼容的问题。

【问题讨论】:

请显示最少的样本数据和预期的结果集。 cobol 还活着吗? :) 是的,大规模的。 @Jen。 . .样本数据和期望的结果真的很有帮助。 【参考方案1】:

尝试如下,对于联合,您需要相同的数据类型

Select A.CustomerId
      , A.CustomerGroup
      , 0   as count
From Customer A
Union 
Select  B.CustomerId
      , B.CustomerGroup
      , select(count(*) from Product C
                   Where C.productId = B.productId
      ) as count
From Product B

【讨论】:

【参考方案2】:

如果您希望联合的第三列是数字(例如整数),那么参与联合的 所有 查询将需要具有该类型。此外,您可能应该重写第二个查询以使用左连接而不是相关子查询:

SELECT
    A.CustomerId,
    A.CustomerGroup
    0 AS count
FROM Customer A
UNION ALL
SELECT
    B.CustomerId,
    B.CustomerGroup,
    COUNT(C.productid)
FROM Product B
LEFT JOIN Product C
    ON C.productId = B.productId
GROUP BY
    B.CustomerId,
    B.CustomerGroup;

注意:我假设您在这里真的想要UNION ALL。如果您的逻辑是给定的客户 ID 和组实际上只能属于 CustomerProduct 表,则继续使用 UNION

【讨论】:

【参考方案3】:

你可以试试这个。由于从您的查询来看,您的column 3 似乎需要空白空间。

Select A.CustomerId
      , A.CustomerGroup
      , Cast(NULL as INT)  as count
From Customer A
Union All
Select DISTINCT B.CustomerId
      , B.CustomerGroup
      , count(*) as count
From Product B INNER JOIN 
Product C Where C.productId = B.productId

【讨论】:

这不是最佳解决方案。【参考方案4】:

我不确定这会完全返回您的结果,但它似乎更有用:

SELECT C.CustomerId, C.CustomerGroup,
       COUNT(p.productid)
FROM Customer C LEFT JOIN
     Product P
     ON C.CustomerId = P.CustomerId AND
        C.CustomerGroup = P.CustomerGroup
GROUP BY C.CustomerId, C.CustomerGroup;

我怀疑CustomerProduct 都有CustomerIdCustomerGroup 列。

我怀疑您的原始查询可能是错误的,您可能真的打算这样做:

SELECT C.CustomerId, C.CustomerGroup,
       COUNT(p.productid)
FROM Customer C LEFT JOIN
     Product P
     ON C.ProductId = P.ProductId 
GROUP BY C.CustomerId, C.CustomerGroup;

【讨论】:

以上是关于DB2 SQL Count over Union of multiple tables with different Datatype的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 查询中一起使用 union 和 count(*)

count(distinct) over (partition by... 在 Oracle SQL 中不起作用

SQL Server count() over() with distinct

sql两张表union all的时候取count,然后进行sum,该怎么实现?

sql中union 和 union all的区别

sql语句or与union all的执行效率哪个更高