繁体   English   中英

查询中的层次结构以获取唯一计数

[英]Hierarchy in a query to get unique count

我有一个跟踪当前工作和工作状态的表。 因此,在我的表格列中,“当前工作”捕获了产品名称以及对该产品执行的不同任务。

如果作品具有子活动,则“作品父名称”列将填有“当前作品”,否则,如果作品是独立作品,则该栏保持空白。 因此,在工作级别或子活动级别仅需要进行一次计数,因此无法在层次结构路径中完全使用。

“状态”列随工作或子工作的进度更新。

![工作表

现在,由于数据的结构不正确,我发现很难计算产品的“进行中”状态。 因此,如果该工作或该工作下的子活动的状态为进行中,我要计算该工作正在进行中

所以我正在寻找的输出如下:

![![![在此处输入图片描述

我尝试进行自我加入,但是由于子活动相同,因此我得到了错误的结果。 我可以通过这种方式从这种类型的数据集中获得结果吗?

好吧...我对您的要求有些困惑。 如果要计数,产品5不应正在进行2吗? 或者,您是否正在尝试获得1(如果正在进行)。

尝试这个...

select w1.work as work, count(*) countInProgress
from work w1 
inner join work w2 on w1.work = w2.parent
where w2.status = 'In Progress'
group by w1.work

或者如果您还想包括父项的进度,则此选项。

select workItem, count(*) countInProgress from
(
select work, @workItem := if(parent is not null,parent,work) workItem
, status
from work
) t 
where status = 'In Progress'
group by workItem

无论哪种方式,这个问题都不清楚。 产品2如何具有WIP任务“进行中”但本身未进行?

构建脚本

CREATE TABLE work (work varchar(20), parent varchar(20), status varchar(20));
INSERT INTO work VALUES
('Product 1',null,'In Progress'),
('Service', 'Product 1','Completed'),
('Delivery', 'Product 1', 'In Progress'),
('Transportation', 'Product 1', 'Completed'),
('Product 2',null,'In Progress'),
('Service', 'Product 2',''),
('Delivery', 'Product 2', 'In Progress'),
('Transportation', 'Product 2', ''),
('Product 3',null,'Completed'),
('Product 4',null,'In Progress'),
('Product 5',null,'In Progress'),
('Delivery', 'Product 5', 'In Progress'),
('Transportation', 'Product 5', 'In Progress')

sqlfiddle链接,如果您想使用它的话... http://sqlfiddle.com/#!9/e0fa02/15希望这会有所帮助...

注释后编辑:

select w1.work as work
,if(w1.status = 'In Progress' or w2.status = 'In Progress',1,0) countInProgress
from work w1 
left join work w2 on w1.work = w2.parent
where w1.parent is null
group by w1.work

旋转一下...

另外,如果您想查看所有子项目都标记为“进行中”的位置

select w1.work as work
,if(w1.status = 'In Progress' or w2.status = 'In Progress',1,0) countInProgress
,@allInProgress := case when @allInProgress is null and w2.status = 'In Progress' then 1
                        when @allInProgress is null and (w2.status <> 'In Progress' or w2.status is null) then 0
                        when w2.status = 'In Progress' then @allInProgress * 1
                        when w2.status <> 'In Progress' then @allInProgress * 0
                        end allInProgress
from work w1 
left join work w2 on w1.work = w2.parent
where w1.parent is null
group by w1.work

我能够使用两个子查询并通过并集函数进行组合来实现我的要求。 我不确定这是最好还是唯一的方法,但是它可以满足我的要求并满足我的要求。

SELECT c.work,
COUNT(
             CASE WHEN w2.status = 'In Progress'
                  THEN '1'
              END) AS inprogress_count
FROM WORK c
INNER JOIN WORK w2 ON c.work = w2.parent
GROUP BY c.work
HAVING  COUNT(
             CASE WHEN w2.status = 'In Progress'
                  THEN '1'
              END) <> 0
UNION 
SELECT w2.work,
COUNT(
            CASE WHEN w2.status = 'In Progress'
                  THEN '1'
              END) AS inprogress_count           
FROM WORK w2
WHERE WORK NOT IN (
SELECT c.work
FROM WORK c
INNER JOIN WORK w2 ON c.work = w2.parent
GROUP BY c.work
HAVING  COUNT(
             CASE WHEN w2.status = 'In Progress'
                  THEN '1'
              END) <> 0)
AND parent IS NULL
GROUP BY w2.work;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM