【问题标题】:Add a IF CASE or something similar inside a query在查询中添加 IF CASE 或类似内容
【发布时间】: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       |
+---------------+--------------+--------+--------------+---------------+

enter image description here

  • 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


【解决方案1】:

您的查询太复杂了,其他任何人都无法真正弄清楚。我建议你简化它——在这个过程中你可能会发现问题。

我可以说您的问题声称您希望每个项目有一行。然而,这不是代码的作用。

您的GROUP BY 是:

group by
  temp.PROJECT,
  temp.CUSTOMER_DESC,
  temp.PRODUCT,
  temp.PREVIOUS_SAMPLES,
  temp.W3,
  temp.W4,
  temp.W5,
  temp.W6

这表示您希望这些值的每个唯一组合都有一行。如果您希望每个项目有一行,我假设您只需:

group by temp.PROJECT

当然,需要调整其余代码来处理这个问题。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2018-10-31
    相关资源
    最近更新 更多