Chr*_*ows 2 sql t-sql sql-server
我有一个父/子/孙子类型表关系定义如下:
tableA:parentID描述
tableB:childID parentId描述
tableC:grandchildID childId description itemComplete
我需要编写一个查询,列出任何给定parentID的tableB中的所有记录,以及孙子记录的总数和已完成的孙子记录的总数(其中itemComplete = true).
parentID将是where子句的一部分(select*from tableB,其中parentId = x).我无法弄清楚的问题是如何从tableC获取计数,因为计数取决于childId的当前行值.
换句话说,我需要某种类似于以下内容的查询:
select description,
(select count (*) from tableC where childId = X) as Items,
(select count (*) from tableC where childId = X And itemComplete = true) as CompleteItems
from tableB where parentId=Y
Run Code Online (Sandbox Code Playgroud)
其中X是tableB中当前行的childId.如何从子查询中的每一行引用childId以获取项目数和项目数?
使用子查询是一种选择,但我更喜欢JOIN这两个表,并使用GROUP BY使用条款CASE语句获取总计.
SELECT b.description
, COUNT(*) AS Items
, SUM(CASE WHEN c.itemComplete = true THEN 1 ELSE 0 END) AS CompleteItems
FROM tableB b
LEFT OUTER JOIN tableC c ON c.childid = b.childid
WHERE b.parentID = 'Y'
GROUP BY
b.description
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用原始语句,则缺少的只是对外表的引用 tableB.childID
select description,
(select count (*) from tableC where childId = tableB.childID) as Items,
(select count (*) from tableC where childId = tableB.childID And itemComplete = true) as CompleteItems
from tableB where parentId=Y
Run Code Online (Sandbox Code Playgroud)
或重新格式化
SELECT description
, (SELECT COUNT(*) FROM tableC WHERE childId = tableB.childID) AS Items,
, (SELECT COUNT(*) FROM tableC WHERE childId = tableB.childID AND itemComplete = true) AS CompleteItems
FROM tableB
WHERE parentId=Y
Run Code Online (Sandbox Code Playgroud)