Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自同一SQL Server表的水平和垂直输出_Sql_Sql Server - Fatal编程技术网

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

来自同一SQL Server表的水平和垂直输出,sql,sql-server,Sql,Sql Server,我不确定这是否可以做到,并尝试了无数次搜索,但还没有真正的结果 我有一个SQL Server数据库,其中有一个表,我希望在其中水平和垂直地从单个表输出结果。我意识到这将是一个复杂的SQL语句,并且已经使用UNION管理了部分垂直部分,但水平部分我无法理解 该表有一个名为reference的字段,包含一个字符串,如A03ACCEVEN18JS-SN1AA或A02ACCVCOM18JS-FN1AA。我想创建一个输出,其中一行用于从A02开始的引用计数,然后一行用于A03、A04等,其中也包含18。然

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

我有一个SQL Server数据库,其中有一个表,我希望在其中水平和垂直地从单个表输出结果。我意识到这将是一个复杂的SQL语句,并且已经使用UNION管理了部分垂直部分,但水平部分我无法理解

该表有一个名为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;

让我们一炮打响:

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)
注:

LEFTreference,3将A0x编号从起始位置拉出。按此分组将为每个不同的A0x编号提供一行,因此如果存在一千个A00到A09的变体,我们将得到10行

您不需要也不应该说像“A03%”这样的引用和像“%%18%%”这样的引用在哪里。。我只是将它们合并为“A0%18%”。请注意,我没有将它们合并为“A03%18%”,因为这会对我们的数据造成太多限制。做“喜欢”的动作时,不要将百分比符号加倍

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


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

,谢谢。它起作用了。我一直在尝试一些水平元素的自连接,但似乎不起作用。我也可以尝试添加一个总计列。