【问题标题】:SQL using COUNT and CASE for related table - error is returned对相关表使用 COUNT 和 CASE 的 SQL - 返回错误
【发布时间】:2017-09-07 21:48:20
【问题描述】:

我有桌子 T1:

ID  GROUPINFO    STATUS
1   GROUP1       NEW
2   GROUP1       INPROG
3   GROUP2       INPROG

我也有 T2 桌

T2ID    T1ID  STATUS
 1       1      NEW
 2       2      NEW
 3       2      VENDOR
 4       3      NEW
 5       3      VENDOR

我想按组计算这些记录中有多少状态为 NEW,以及这些记录中有多少处于状态 VENDOR(来自 T2 表的信息)

此 SQL 有效

SELECT T1.GROUPINFO,
count (case when T1.status='NEW' then 1 end) as New
FROM T1
GROUP BY T1.GROUPINFO

但是,当我尝试添加这些记录中有多少处于供应商状态时,我收到了一个错误:

SELECT T1.GROUPINFO,
count (case when T1.status='NEW' then 1 end) as New,
count (case when T1.ID in (select T2.ID from T2 where T2.status='VENDOR') then 1 end) as Vendor
FROM T1
GROUP BY T1.GROUPINFO

我收到一个错误:

糟糕的计划;找到未解析的 QNC

我不确定我做错了什么以及我应该如何组织我的 SQL 查询以便我可以得到这个示例的结果:

GROUPINFO   NEW   VENDOR
GROUP1       1     1
GROUP2       0     1

如果 ID 在 T2 中存在多次,则应仅计算 1 次,因为这是我要检查其是否处于该状态的一条记录。

更新: 我也试过 EXISTS:

SELECT T1.GROUPINFO,
count (case when T1.status='NEW' then 1 end) as New,
count (case when exists (select 1  from T2 where T2.ID=T1.ID and T2.status='VENDOR') then 1 end) as Vendor
FROM T1
GROUP BY T1.GROUPINFO

但再次出现 SQL 错误:关于 ID 列

更新: 我也尝试过 EXISTS 和 JOIN:

SELECT T1.GROUPINFO,
count (case when T1.status='NEW' then 1 end) as New,
count (case when exists (select 1  from T2 where T2.ID=T1.ID and T2.status='VENDOR') then 1 end) as Vendor
FROM T1 LEFT OUTER JOIN T2 ON T1.ID=T2.ID
GROUP BY T1.GROUPINFO

但再次出现 SQL 错误:关于 ID 列

【问题讨论】:

  • 您可以在 id 上加入它们,而不是在 case 语句中尝试嵌套查询。您可能需要一个临时表先加入它们,然后您可以从该表中获得所需的结果
  • 你能举个例子吗?因为看起来不是那么简单,所以我什至尝试了 JOIN 但非常重要的是我必须基于 GROUPINFO 列而不是 ID 列进行分组
  • 我更新了我尝试过的内容,但又遇到了问题。如果您有某种解决方案,您能帮帮我吗?

标签: sql select count db2 case


【解决方案1】:
select T3.Groupinfo,
count (distinct(case when t3.status="NEW" then t3.ID end)) as new,
count (distinct(case when t3.status_1 ="VENDOR" then t3.id end)) as Vendor
from 
(select t1.groupinfo,t1.id,t1.status,t2.t2id as id1,t2.status as status_1 from
t1 join t2
on t1.id=t2.t1id
) as t3
group by t3.Groupinfo;

我猜类似的东西可能会对你有所帮助。

【讨论】:

  • 我可以问你两个问题吗?如果特定 ID(例如 ID 1)的 VENDOR 状态在 T2 表中多次存在,您的 COUNT 会多次计数还是只计数一次,因为那是相同的 ID 记录?我想只数1,你能确认一下吗?第二个问题,如果我想另外过滤我的 TABLE T1,我在 JOIN 和 ON 子句之后添加 where 子句是否正确? T3 子句正确后我没有过滤它?
  • 它会计算两次,因为它是按 groupinfo 而不是 id 分组的。您可以在子查询内的 on 子句之后添加更多条件,因为这样会更有效。如果您想获取单个值,您可能必须使用 groupinfo、id 和 status_1 的组合删除重复项
  • 我更新了我的 TABLE T2 请看一下。它有自己的 ID,但表 T1 和 T2 通过 T1 ID 列连接。您提到按 GROUPINFO、ID 和 STATUS1 对其进行分组,但我所有这些都具有相同的值,我只想计数一次
  • 如果我将 DISTINCT 放在计数之后,我会遇到错误并且无法执行 sql 查询:(
  • 你想要什么不同的价值观?它是来自 T1 的 id 还是来自 T2 的 T2Id?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2018-10-05
  • 2014-11-01
  • 2021-07-30
  • 2017-09-16
  • 2019-09-06
相关资源
最近更新 更多