代码之家  ›  专栏  ›  技术社区  ›  AJF

来自同一SQL Server表的水平和垂直输出

  •  1
  • AJF  · 技术社区  · 7 年前

    我不确定这是否可以做到,并尝试了无数次搜索,但还没有真正的结果。

    该表有一个名为“reference”的字段,并包含一个字符串,如“A03ACCEVEN18JS-SN1AA”或“A02ACCVCOM18JS-FN1AA”。我想创建一个输出,其中一行用于从A02开始的引用计数,然后一行用于A03、A04等,也包含“18”。然后水平展开以计算连字符后面带有不同字母的引用,即“-s”和“-f”等,因此输出如下所示,

                   S_Count | F_Count | J_Count etc
                   ---------------------------------
    A02 Row -->      58    |   23    |    16
    A03 Row -->      22    |   43    |    53
    A04 Row -->      7     |   31    |    23
    etc
    

    到目前为止,我设法得到了一个包含多个where子句和联合的列,如下所示,但我现在需要垂直的。可以这样做吗?

    SELECT COUNT(reference) FROM mytable
    WHERE reference LIKE 'A02%' AND reference LIKE '%%18%%' AND PATINDEX('%-P%', 
    reference) <> 0
    UNION
    SELECT COUNT(reference) FROM mytable
    WHERE reference LIKE 'A03%' AND reference LIKE '%%18%%' AND PATINDEX('%-P%', 
    reference) <> 0
    UNION
    SELECT COUNT(reference) AS TOTAL FROM mytable
    WHERE reference LIKE 'A04%' AND reference LIKE '%%18%%' AND PATINDEX('%-P%', 
    reference) <> 0;
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Caius Jard    7 年前

    让我们一炮打响:)

    SELECT
        LEFT(reference, 3) as ao_number,
        SUM(CASE WHEN reference LIKE '%-S%' THEN 1 ELSE 0 END) as s_count,
        SUM(CASE WHEN reference LIKE '%-F%' THEN 1 ELSE 0 END) as j_count,
        SUM(CASE WHEN reference LIKE '%-J%' THEN 1 ELSE 0 END) as s_count
    FROM
        table
    WHERE
        reference like 'A0%18%'
    GROUP BY
        LEFT(reference, 3)
    

    笔记:

    LEFT(reference, 3)

    你不需要(也不应该)说 WHERE reference LIKE 'A03%' AND reference LIKE '%%18%%' 等我只是将它们合并为“A0%18%”。请注意,我没有将它们合并为“A03%18%”,因为这会对我们的数据造成太多限制。做“喜欢”的动作时,不要将百分比符号加倍

    总和进行计数;当在引用中查找a时,如果其中包含-S,则返回1,否则返回0。将这些数据相加可以有效地统计参考模式

    顺便说一下,为了将来的搜索目的,这种类型的查询称为PIVOT。大多数数据库都有一些专有的语法来执行数据透视,但我倾向于记住/利用这种模式,因为它更灵活,而且跨数据库兼容