我有一条SQL语句,列出了有关工作的债权人名单。 在图像的例子中,两个债权人都属于同一个工作。 因此,在显示TOTALS的最后一行上,作业数为1,这是正确的,因为它是相同的作业。同样说NotPOD的列也正确,只说1。 但对于所有其他列,它正在添加总计。就像说FL的专栏(它是一个片段类型)。这项工作只有1件FL型。但由于该工作有两个债权人,即使只有一个存在,总数也会显示两个。
我不知道总数对于工作和NotPOD是否正确。
这是sql语句:
SET group_concat_max_len=10000000;
set @sql = null;
select
group_concat(distinct
concat(
'sum((select sum(jp1.AdvisedQty)
from job_pieces jp1
left join piecestype pt1 on jp1.TypeID = pt1.ID
where jp1.jobid=jn.id and pt1.code=''', pt.Code , '''
)) AS `', pt.Code, '`'
)
) into @sql
FROM creditor c
LEFT JOIN invoicedetail i on c.ID = i.creditorId
LEFT JOIN job_new jn ON i.JobID = jn.ID
LEFT JOIN job_pieces jp ON jp.JobID = jn.ID
LEFT JOIN piecestype pt on jp.TypeID = pt.ID
WHERE c.Company_ID = ?compid;
set @sql = concat('select
ifnull(c.Name,''TOTAL'') as Name,
COUNT(distinct jn.ID) as Jobs,
sum(case when (select count(jbs.status) from jobstat jbs
where jbs.jobid=jn.id and jbs.Status=''DEL'')>0
then 1 else 0 end) as Delivered,
sum(case when (select count(jbs.status) from jobstat jbs
where jbs.jobid=jn.id and jbs.Status=''POD'')>0
then 1 else 0 end) as POD,
SUM((select COUNT(ID) from job_debriefs
WHERE JobID = jn.ID)) as Debriefs,
sum(jn.OutTurn) as Outturn,
SUM(jn.ActualWeight) as GrossWt,
', @sql, '
FROM creditor c
LEFT JOIN invoicedetail i on c.ID = i.creditorId
LEFT JOIN job_new jn ON i.JobID = jn.ID
LEFT JOIN job_pieces jp ON jp.JobID = jn.ID
LEFT JOIN piecestype pt on jp.TypeID = pt.ID
WHERE c.Company_ID = ', ?compid, GROUP BY c.Name WITH ROLLUP
答案 0 :(得分:2)
使用with rollup
和count(distinct)
时,sum
- 标记会执行不同的操作。
对于COUNT(distinct jn.ID)
,它将为您提供所有显示数据的不同Jobid数。这可能就是你想要的。
对于像sum(case...) as POD
这样的总和列,它只会为您提供所有显示值的总和 - 如果作业具有状态" POD&POD将为" 2" #34;
至于NotPOD-Column:我假设你只是在你的客户端中对它进行了计算(可能是作业 - POD),并且由于POD为0(可能已经是2),它看起来很好。我假设你计算"单位"在你的客户端(作为4件类型的总和)。如果没有,您的代码就不适合您的照片。
那么如何解决呢?
嗯,基本上你不能使用with rollup
,主要是因为你不想拥有显示值的总和,这就是with rollup
的用途。
最简单的解决方案是手动计算总行数并将其与union
合并,例如像这样的东西:
select c.Name as Name,
COUNT(distinct jn.ID) as Jobs,
...
sum(jn.OutTurn) as Outturn,
SUM(jn.ActualWeight) as GrossWt,
...
FROM creditor c
LEFT JOIN invoicedetail i on c.ID = i.creditorId
LEFT JOIN job_new jn ON i.JobID = jn.ID
-- !!! DO NOT USE LEFT JOIN job_pieces jp ON jp.JobID = jn.ID !!!
-- !!! DO NOT USE LEFT JOIN piecestype pt on jp.TypeID = pt.ID !!!
WHERE c.Company_ID = ', ?compid, GROUP BY c.Name, '
UNION
''Total'',
COUNT(distinct jn.ID) as Jobs,
...
sum(jn.OutTurn) as Outturn,
SUM(jn.ActualWeight) as GrossWt,
...
-- you have to figure out what number you need here for the pieces
-- you probably want to seperate that part too (as you did with @sql)
-- (select sum(jp1.AdvisedQty) from job_pieces jp1 ... ) as FL
...
from job_new jn
WHERE exists(select 1
FROM creditor c
JOIN invoicedetail i on c.ID = i.creditorId
where i.JobID = jn.ID and c.Company_ID = ', ?compid, '
)
第二部分没有group by
!
您必须弄清楚每件总和需要什么值,并且您可能希望使用与select
group_concat(distinct ...
类似的声明来准备它们
并警告:如果我理解你的数据模型,你绝对必须删除
LEFT JOIN job_pieces jp ON jp.JobID = jn.ID
LEFT JOIN piecestype pt on jp.TypeID = pt.ID
语句,因为当您在一个作业中有多个工件或片段类型时,它们会破坏您的值(您可以尝试向作业添加第二个值并查看)。如果你有可能在一个invoicedetail
上完成两次相同的工作,你也必须修复那个部分。
请注意,在工会部分,您无法加入客户(您会多次计算所有内容)。
答案 1 :(得分:0)
我怀疑你的问题是因为你的群体状况。
你执行GROUP BY c.Name WITH ROLLUP,据我所知 - 你的c.Name是债权人的名字。
尝试按作业ID或记录的其他唯一标识符进行分组。