如何解决不明确的列名错误 SQL
How to resolve Ambiguous column name error SQL
我正在使用以下查询并收到错误“列名不明确 'area'”。我读了一些书,发现它在 CTE 中而不是分组 by/order 是错误的原因。似乎不是我的情况。此查询的最终结果应该如下所示。关于我需要在哪里 add/subtract 提及区域的任何想法?
为了提供一些上下文,某些元素的原因是即使没有数据,结果集也包含一个预先确定的 sizeclassep 列表。对于某些地区,没有数据。 650 的人口不允许某些行业。此外,xyzfirms201701 中有 29 列。 Area、sizeclassep、ownership 和 naicscode 只是其中包含的一些字段。
数据是机密的,很遗憾不能提供任何数据
;with sizeclasseptable as
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area from xyzfirms201701 ) t1
)
SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
from sizeclasseptable
inner join xyzfirms201701 t2
on t2.area=sizeclasseptable.area
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep
area SizeClassep Number of Worksites Employment In Size Class
000003 01 10866 13138
000003 02 1275 8322
000003 03 831 11192
000003 04 492 14694
000003 05 116 7783
000003 06 61 8876
000003 07 8 2809
000003 08 11 7909
000003 09 3 5322
您在联盟 area='000003'
中拥有 [area],并且在 select distinct area from xyzfirms201701
中再次拥有它。您实际上想使用哪一个作为 "area"?鉴于您似乎只希望在最终结果中使用 '000003'
,然后使用 t0.area
(参见下面的第二行)。
如果您在 cte 中使用交叉连接,我假设您想要返回所有行,所以使用左连接而不是内部连接(?注意,我猜这个)
您当前按 t2.area 分组,但未包含在 select 子句中。要么从分组中省略它,要么将其包含在 select 子句中。请注意,因为 [area] 它是连接的一部分,所以它只能是您放入 CTE 的任何值,所以我建议您使用 sizeclasseptable.area
;with sizeclasseptable as (
select t0.area,ownership,sizeclassep
from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union all select '02' as sizeclassep, '50' as ownership, area='000003'
union all select '03' as sizeclassep, '50' as ownership, area='000003'
union all select '04' as sizeclassep, '50' as ownership, area='000003'
union all select '05' as sizeclassep, '50' as ownership, area='000003'
union all select '06' as sizeclassep, '50' as ownership, area='000003'
union all select '07' as sizeclassep, '50' as ownership, area='000003'
union all select '08' as sizeclassep, '50' as ownership, area='000003'
union all select '09' as sizeclassep, '50' as ownership, area='000003'
) t0
/* cross join ( select distinct area from xyzfirms201701 ) t1 */
)
SELECT
sizeclasseptable.area AS [area]
, t2.SizeClassep
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = sizeclasseptable.area
AND t2.ownership = sizeclasseptable.ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
sizeclasseptable.area
, t2.SizeClassep
ORDER BY
sizeclasseptable.area
, t2.SizeClassep
编辑
另一种方法:
DECLARE @ownership varchar(20) = '50'
DECLARE @area varchare(20) = '000003'
WITH sizeclasseptable
AS (
SELECT
sizeclassep
FROM (
select '01' as sizeclassep
union all select '02' as sizeclassep
union all select '03' as sizeclassep
union all select '04' as sizeclassep
union all select '05' as sizeclassep
union all select '06' as sizeclassep
union all select '07' as sizeclassep
union all select '08' as sizeclassep
union all select '09' as sizeclassep
) t0
)
SELECT
t2.area
, t2.SizeClassep
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = @area
AND t2.ownership = @ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area
, t2.SizeClassep
ORDER BY
t2.area
, t2.SizeClassep
编辑 2
也许减少查询迭代次数的一种方法是将分组扩展到用于 select 该数据的所有 3 列,并扩大 where 子句的定义方式。还有一种使用 values
生成 SizeClassep 行的不同方法
SELECT
t2.area
, t2.SizeClassep
, t2.ownership
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM (
SELECT
sizeclassep
FROM (
VALUES ('01'), ('01'), ('03'), ('04'), ('05'), ('06'), ('07'), ('08'), ('09')
) t0 (sizeclassep)
) sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.sizeclassep = sizeclasseptable.sizeclassep
AND t2.area IN ('0003','0004','0005','0006') /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND t2.ownership IN ('50','60','70') /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND
GROUP BY
t2.area
, t2.SizeClassep
, t2.ownership
ORDER BY
t2.area
, t2.SizeClassep
, t2.ownership
您的 cte 和 xyzfirms201701 中的列名相同。您必须在 table 中的任何一个中重命名它才能使此查询生效。或者,您可以只创建别名列名,如下所示。但是,当您不需要 table 中的任何列时,交叉连接在这里没有意义。它只会创建重复记录。
以下应该有效。注意区域列的 a1 别名。
;with sizeclasseptable as
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area a1 from xyzfirms201701 ) t1
)
SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
from sizeclasseptable
inner join xyzfirms201701 t2
on t2.area=sizeclasseptable.area
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep
我正在使用以下查询并收到错误“列名不明确 'area'”。我读了一些书,发现它在 CTE 中而不是分组 by/order 是错误的原因。似乎不是我的情况。此查询的最终结果应该如下所示。关于我需要在哪里 add/subtract 提及区域的任何想法?
为了提供一些上下文,某些元素的原因是即使没有数据,结果集也包含一个预先确定的 sizeclassep 列表。对于某些地区,没有数据。 650 的人口不允许某些行业。此外,xyzfirms201701 中有 29 列。 Area、sizeclassep、ownership 和 naicscode 只是其中包含的一些字段。
数据是机密的,很遗憾不能提供任何数据
;with sizeclasseptable as
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area from xyzfirms201701 ) t1
)
SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
from sizeclasseptable
inner join xyzfirms201701 t2
on t2.area=sizeclasseptable.area
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep
area SizeClassep Number of Worksites Employment In Size Class
000003 01 10866 13138
000003 02 1275 8322
000003 03 831 11192
000003 04 492 14694
000003 05 116 7783
000003 06 61 8876
000003 07 8 2809
000003 08 11 7909
000003 09 3 5322
您在联盟 area='000003'
中拥有 [area],并且在 select distinct area from xyzfirms201701
中再次拥有它。您实际上想使用哪一个作为 "area"?鉴于您似乎只希望在最终结果中使用 '000003'
,然后使用 t0.area
(参见下面的第二行)。
如果您在 cte 中使用交叉连接,我假设您想要返回所有行,所以使用左连接而不是内部连接(?注意,我猜这个)
您当前按 t2.area 分组,但未包含在 select 子句中。要么从分组中省略它,要么将其包含在 select 子句中。请注意,因为 [area] 它是连接的一部分,所以它只能是您放入 CTE 的任何值,所以我建议您使用 sizeclasseptable.area
;with sizeclasseptable as (
select t0.area,ownership,sizeclassep
from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union all select '02' as sizeclassep, '50' as ownership, area='000003'
union all select '03' as sizeclassep, '50' as ownership, area='000003'
union all select '04' as sizeclassep, '50' as ownership, area='000003'
union all select '05' as sizeclassep, '50' as ownership, area='000003'
union all select '06' as sizeclassep, '50' as ownership, area='000003'
union all select '07' as sizeclassep, '50' as ownership, area='000003'
union all select '08' as sizeclassep, '50' as ownership, area='000003'
union all select '09' as sizeclassep, '50' as ownership, area='000003'
) t0
/* cross join ( select distinct area from xyzfirms201701 ) t1 */
)
SELECT
sizeclasseptable.area AS [area]
, t2.SizeClassep
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = sizeclasseptable.area
AND t2.ownership = sizeclasseptable.ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
sizeclasseptable.area
, t2.SizeClassep
ORDER BY
sizeclasseptable.area
, t2.SizeClassep
编辑
另一种方法:
DECLARE @ownership varchar(20) = '50'
DECLARE @area varchare(20) = '000003'
WITH sizeclasseptable
AS (
SELECT
sizeclassep
FROM (
select '01' as sizeclassep
union all select '02' as sizeclassep
union all select '03' as sizeclassep
union all select '04' as sizeclassep
union all select '05' as sizeclassep
union all select '06' as sizeclassep
union all select '07' as sizeclassep
union all select '08' as sizeclassep
union all select '09' as sizeclassep
) t0
)
SELECT
t2.area
, t2.SizeClassep
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = @area
AND t2.ownership = @ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area
, t2.SizeClassep
ORDER BY
t2.area
, t2.SizeClassep
编辑 2
也许减少查询迭代次数的一种方法是将分组扩展到用于 select 该数据的所有 3 列,并扩大 where 子句的定义方式。还有一种使用 values
SELECT
t2.area
, t2.SizeClassep
, t2.ownership
, COUNT(*) AS [Number of Worksites]
, SUM(t2.Employment) AS [Employment In Size Class]
FROM (
SELECT
sizeclassep
FROM (
VALUES ('01'), ('01'), ('03'), ('04'), ('05'), ('06'), ('07'), ('08'), ('09')
) t0 (sizeclassep)
) sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.sizeclassep = sizeclasseptable.sizeclassep
AND t2.area IN ('0003','0004','0005','0006') /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND t2.ownership IN ('50','60','70') /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND
GROUP BY
t2.area
, t2.SizeClassep
, t2.ownership
ORDER BY
t2.area
, t2.SizeClassep
, t2.ownership
您的 cte 和 xyzfirms201701 中的列名相同。您必须在 table 中的任何一个中重命名它才能使此查询生效。或者,您可以只创建别名列名,如下所示。但是,当您不需要 table 中的任何列时,交叉连接在这里没有意义。它只会创建重复记录。
以下应该有效。注意区域列的 a1 别名。
;with sizeclasseptable as
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area a1 from xyzfirms201701 ) t1
)
SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
from sizeclasseptable
inner join xyzfirms201701 t2
on t2.area=sizeclasseptable.area
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep