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