【发布时间】:2021-04-23 12:12:44
【问题描述】:
我有一个查询结果,但是有一个包含“项目编号”的字段出现了两次,并且应该是所有样本的 COUNT,计数出现了两次。知道如何解决这个问题吗?
- 更新:
我现在可以显示表格数据结构
这里或多或少是表格的信息:
- 示例表
+---------------+--------------+--------+--------------+--------------+
| sample_number | project | status | template | parent_aliquot|
+---------------+--------------+--------------+----------+-------------+
| 1 | S/180318/01 | C | KPS_DEFAULT | 50 |
| 2 | S/180320/01 | I | KPS_DEFAULT | 100 |
+---------------+--------------+--------+--------------+---------------+
-
KPS_SMP_DUE_DATE_WEEK_PIVOT_VW表(该表显示了一个项目一年内过期的样本数量)
+---------------+--------------+----------+-------------+----+----+-----+-----+
| project | product | year | department | w0 | w1 | ... | w53 |
+---------------+--------------+----------+-------------+----+----+-----+-----+
| S/000260/02 | Product v1 | 2020 | MICRO | 1 | | | 1 |
| S/180146/04 | Product v2 | 2021 | QC | | 2 | | 3 |
+---------------+--------------+----------+-------------+----+----+-----+-----+
这是我目前拥有的代码:
Select
temp.PROJECT,
temp.CUSTOMER_DESC,
temp.PRODUCT,
ISNULL(temp.PREVIOUS_SAMPLES,0),
ISNULL(temp.W3,0) as 'W3',
ISNULL(temp.W4,0) as 'W4',
ISNULL(temp.W5,0) as 'W5',
ISNULL(temp.W6,0) as 'W6',
sum(
ISNULL(temp.PREVIOUS_SAMPLES,0)
+ ISNULL(temp.W3,0)
+ ISNULL(temp.W4,0)
+ ISNULL(temp.W5,0)
+ ISNULL(temp.W6,0)
) as 'TOTAL'
from (
SELECT
vw.PROJECT,
vw.CUSTOMER_DESC,
vw.PRODUCT,
(
SELECT COUNT(s.SAMPLE_NUMBER)
FROM SAMPLE s
WHERE s.PROJECT = vw.PROJECT
AND s.STATUS IN ('I', 'U', 'P')
and s.TEMPLATE = 'KPS_DEFAULT'
AND s.PARENT_ALIQUOT > 0
) as 'PREVIOUS_SAMPLES',
ISNULL(vw.W3,0) as 'W3',
ISNULL(vw.W4,0) as 'W4',
ISNULL(vw.W5,0) as 'W5',
ISNULL(vw.W6,0) as 'W6'
FROM KPS_SMP_DUE_DATE_WEEK_PIVOT_VW vw
WHERE vw.DEPARTMENT IN ('QC')
GROUP BY
vw.PROJECT,
vw.CUSTOMER_DESC,
vw.PRODUCT,
vw.W3,
vw.W4,
vw.W5,
vw.W6
) as TEMP
group by
temp.PROJECT,
temp.CUSTOMER_DESC,
temp.PRODUCT,
temp.PREVIOUS_SAMPLES,
temp.W3,
temp.W4,
temp.W5,
temp.W6
UNION
Select
'Total',
'-',
'-',
sum(ISNULL(temp.PREVIOUS_SAMPLES,0) ),
sum( ISNULL(temp.W3,0) ),
sum( ISNULL(temp.W4,0) ),
sum( ISNULL(temp.W5,0) ),
sum( ISNULL(temp.W6,0) ),
sum(
ISNULL(temp.PREVIOUS_SAMPLES,0)
+ ISNULL(temp.W3,0)
+ ISNULL(temp.W4,0)
+ ISNULL(temp.W5,0)
+ ISNULL(temp.W6,0)
)
from (
SELECT
vw.PROJECT,
vw.CUSTOMER_DESC,
vw.PRODUCT,
(
SELECT COUNT(s.SAMPLE_NUMBER)
FROM SAMPLE s
WHERE s.PROJECT = vw.PROJECT
AND s.STATUS IN ('I', 'U', 'P')
and s.TEMPLATE = 'KPS_DEFAULT'
AND s.PARENT_ALIQUOT > 0
) as 'PREVIOUS_SAMPLES',
ISNULL(vw.W3,0) as 'W3',
ISNULL(vw.W4,0) as 'W4',
ISNULL(vw.W5,0) as 'W5',
ISNULL(vw.W6,0) as 'W6'
FROM KPS_SMP_DUE_DATE_WEEK_PIVOT_VW vw
WHERE vw.DEPARTMENT IN ('QC')
GROUP BY
vw.PROJECT,
vw.CUSTOMER_DESC,
vw.PRODUCT,
vw.W3,
vw.W4,
vw.W5,
vw.W6
) as TEMP
如图所示,我标记了重复的项目。
【问题讨论】:
-
请删除 IDE (TOAD) 的标签并添加您的 DBMS 的标签 (Why?)
-
这看起来不像 Oracle SQL。
-
这里的大多数人都希望样本表和预期结果为格式化文本,而不是图像。不要忘记简化 - minimal reproducible example.
-
我猜,首先 UNION ALL,然后 GROUP BY 结果。
-
1) 你
group by通过 W1、W2 等,但使用isnull(Wn, 0),所以这将返回重复的行。 2)您可以在with子句中包含子查询并重用代码而无需复制粘贴(这是非常错误的方式)。除了group by之外,还有rollup可以为您计算总数。 3) 您应该避免使用UNION,因为您确实不需要删除重复项(这种总计计算很少见),请使用UNION ALL。最后:避免使用代码或数据的图像,它们不可重用且所有人都无法访问。输入您的数据作为有问题的文本以提供查询上下文
标签: sql sql-server count