Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 多种情况下的情况_Sql_Tsql - Fatal编程技术网

Sql 多种情况下的情况

Sql 多种情况下的情况,sql,tsql,Sql,Tsql,我有多个表,正在对它们执行JOIN。我想把它们分组,条件是某个字段以某个字母开头,然后按区域分组。我就是这样走的 SELECT CASE WHEN PNumber LIKE 'F%' THEN 'F' WHEN PNumber LIKE 'CE%' THEN 'CE' WHEN PNumber LIKE 'CXT%' THEN 'CXT' END AS p_by_type , COUNT(*) AS p_by_count FROM ( SELECT

我有多个表,正在对它们执行
JOIN
。我想把它们分组,条件是某个字段以某个字母开头,然后按区域分组。我就是这样走的

SELECT
  CASE    
    WHEN PNumber LIKE 'F%' THEN 'F'
    WHEN PNumber LIKE 'CE%' THEN 'CE'
    WHEN PNumber LIKE 'CXT%' THEN 'CXT'
  END AS p_by_type
, COUNT(*) AS p_by_count
FROM (
    SELECT [xml_P].Id, [xml_P].PNumber, [xml_PSR].ScopeRegion, [xml_SR].RegionCode
    FROM [xml_P]
    JOIN [xml_PSR]
    ON [xml_P].Id = [xml_PSR].Pol
    JOIN [xml_SR]
    ON [xml_PSR].SR = [xml_SR].Id) PWithRegions
GROUP BY 
  CASE
    WHEN PNumber LIKE 'F%' THEN 'F'
    WHEN PNumber LIKE 'CE%' THEN 'CE'
    WHEN PNumber LIKE 'CXT%' THEN 'CXT'
  END
GO
上面的代码给出了计数,没有考虑区域。如果我希望每个
PNumber
的计数以每个唯一
[xml\u SR].RegionCode
的F、CE、CXT开头,我该如何进行。这是针对
[xml\u SR].RegionCode=AMER
我想要F、CE、CXT的计数,然后是针对
[xml\u SR].RegionCode=CH
我想要相同的计数,依此类推

执行嵌套查询:

SELECT [xml_P].Id, [xml_P].PNumber, [xml_PSR].ScopeRegion, [xml_SR].RegionCode
FROM [xml_P]
JOIN [xml_PSR]
ON [xml_P].Id = [xml_PSR].Pol
JOIN [xml_SR]
ON [xml_PSR].SR = [xml_SR].Id
Id、PNNumber、ScopeRgion、RegionCode 1、F586、42、EMEA .. 22、CE86、42、EMEA .. 44、CXT6、42、EMEA .. 101、F56、42、EMEA .. 105、F996、43、CH .. 122、CXT186、43、CH .. 44、CXT196、43、CH .. 101、CE5556、43、CH

执行完整查询会得到如下结果集:

按类型分组,按计数分组 F,39岁 CXT,258 行政长官,77岁

我希望输出是

F、 第25章 F、 3、欧洲、中东和非洲
..

您只需在您的选择中添加RegionCode,然后在您的组中添加

因此,您将获得每个PNumber中每个RegionCode的计数

SELECT
  CASE    
    WHEN PNumber LIKE 'F%' THEN 'F'
    WHEN PNumber LIKE 'CE%' THEN 'CE'
    WHEN PNumber LIKE 'CXT%' THEN 'CXT'
  END AS p_by_type
, RegionCode
, COUNT(*) AS p_by_count
FROM (
    SELECT [xml_P].Id, [xml_P].PNumber, [xml_PSR].ScopeRegion, [xml_SR].RegionCode
    FROM [xml_P]
    JOIN [xml_PSR]
    ON [xml_P].Id = [xml_PSR].Pol
    JOIN [xml_SR]
    ON [xml_PSR].SR = [xml_SR].Id) PWithRegions
GROUP BY 
  CASE
    WHEN PNumber LIKE 'F%' THEN 'F'
    WHEN PNumber LIKE 'CE%' THEN 'CE'
    WHEN PNumber LIKE 'CXT%' THEN 'CXT'
  END, RegionCode
GO

您只需将
RegionCode
添加到
groupby
。但是,您的查询过于复杂--不需要子查询:

SELECT (CASE WHEN p.PNumber LIKE 'F%' THEN 'F'
             WHEN p.PNumber LIKE 'CE%' THEN 'CE'
             WHEN p.PNumber LIKE 'CXT%' THEN 'CXT'
        END) as p_by_type,
       sr.RegionCode,
       COUNT(*) AS p_by_count
FROM xml_P p JOIN
     xml_PSR psr
     ON p.Id = psr.Pol JOIN
     xml_SR sr
     ON psr.SR = sr.Id
GROUP BY (CASE WHEN p.PNumber LIKE 'F%' THEN 'F'
               WHEN p.PNumber LIKE 'CE%' THEN 'CE'
               WHEN p.PNumber LIKE 'CXT%' THEN 'CXT'
          END),
         sr.RegionCode;
注:

  • 表别名使查询更易于编写和读取
  • 不需要子查询
  • 您应该在
    选择
    分组依据
    中包含所需的区域代码
  • 使用转义字符,例如
    [
    ,如果不需要的话,只会使查询变得混乱

编辑您的问题,并提供示例数据和所需结果。尝试了该操作,但出现以下错误:在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。hm..请参阅@GordonLinoff bellow的答案,更好:)