【问题标题】:Invalid column name error in SQL sub-query with GROUP BY使用 GROUP BY 的 SQL 子查询中的列名无效错误
【发布时间】:2016-09-09 10:13:47
【问题描述】:
SELECT 
    CepTel,
    (SELECT u
        top 1 sa1.SirketAdi 
    FROM
        SatisTum sa1 
    WHERE s.MusteriNo = sa1.MusteriNo) s1,
    (SELECT 
        top 1 sa2.FaturaSahibi 
    FROM
        SatisTum sa2 
    WHERE s.MusteriNo = sa2.MusteriNo) s2,
    (SELECT 
        top 1 sa3.Ad 
    FROM
        SatisTum sa3 
    WHERE s.MusteriNo = sa3.MusteriNo) s3,
    (SELECT 
        top 1 sa4.Soyad 
    FROM
        SatisTum sa4 
    WHERE s.MusteriNo = sa4.MusteriNo) s4,
    COUNT(DISTINCT MusteriNo) 
FROM
    SatisTum s 
GROUP BY CepTel,s1,s2,s3,s4 
HAVING COUNT(DISTINCT MusteriNo) > 1 
ORDER BY COUNT(DISTINCT MusteriNo)

错误:

Invalid column name 's1'.
Invalid column name 's2'.
Invalid column name 's3'.
Invalid column name 's4'.

【问题讨论】:

  • 将查询包装在派生表中,然后进行分组。

标签: sql group-by subquery


【解决方案1】:

你的问题很尴尬。你有TOP 1,但是没有ORDER BY,意味着结果是不确定的。

但是,您可以使用OUTER APPLY 解决问题:

Select CepTel, s1.SirketAdi, s2.FaturaSahibi, s3.Ad, s4.Soyad,
       Count(Distinct MusteriNo)
From SatisTum s outer apply
     (Select top 1 sa1.SirketAdi From SatisTum sa1 Where s.MusteriNo = sa1.MusteriNo
     ) s1 outer apply
     (Select top 1 sa2.FaturaSahibi From SatisTum sa2 Where s.MusteriNo = sa2.MusteriNo
     ) s2 outer apply
     (Select top 1 sa3.Ad From SatisTum sa3 where s.MusteriNo = sa3.MusteriNo
     ) s3 outer apply
     (Select top 1 sa4.Soyad  From SatisTum sa4 where s.MusteriNo = sa4.MusteriNo
     ) s4
group by  CepTel, s1.SirketAdi, s2.FaturaSahibi, s3.Ad, s4.Soyad
having Count(Distinct MusteriNo) > 1 
order by COUNT(distinct MusteriNo);

如果这可行,但没有达到您想要的效果,请使用示例数据、所需结果以及您要计算的内容的解释提出另一个问题。

【讨论】:

  • 我得到了 s1.SirketAdi , s2.FaturaSahibi , s3.Ad , s4.Soyad null
【解决方案2】:

您不能按别名进行分组。

使用实际的表达方式

group by (Select top 1 sa1.SirketAdi From SatisTum sa1 Where s.MusteriNo = sa1.MusteriNo ), 

【讨论】:

  • 我们不能在 group by 中使用 select 查询
【解决方案3】:

你在 group by 中使用了别名,所以它会抛出错误:

group by CepTel , s1 , s2 , s3 , s4

改为替换原来的列

Select CepTel , 
    (Select top 1 sa1.SirketAdi From SatisTum sa1 Where s.MusteriNo = sa1.MusteriNo ) s1, 
    (Select top 1 sa2.FaturaSahibi From SatisTum sa2 Where s.MusteriNo = sa2.MusteriNo ) s2 , 
    (Select top 1 sa3.Ad From SatisTum sa3 where s.MusteriNo = sa3.MusteriNo ) s3, 
    (Select top 1 sa4.Soyad From SatisTum sa4 where s.MusteriNo = sa4.MusteriNo) s4, 
    Count(Distinct MusteriNo) 
From SatisTum s 
group by CepTel , 
    (Select top 1 sa1.SirketAdi From SatisTum sa1 Where s.MusteriNo = sa1.MusteriNo ) , 
    (Select top 1 sa2.FaturaSahibi From SatisTum sa2 Where s.MusteriNo = sa2.MusteriNo ) ,
    (Select top 1 sa3.Ad From SatisTum sa3 where s.MusteriNo = sa3.MusteriNo ), 
    (Select top 1 sa4.Soyad From SatisTum sa4 where s.MusteriNo = sa4.MusteriNo)
having Count(Distinct MusteriNo) > 1 order by COUNT(distinct MusteriNo)

【讨论】:

  • 我收到此错误消息:无法在用于 GROUP BY 子句的分组列表的表达式中使用聚合或子查询。
【解决方案4】:

这样试试,

SELECT T.CepTel
    ,T.s1
    ,T.s2
    ,T.s3
    ,T.s4
    ,Count(DISTINCT T.MusteriNo)
FROM (
    SELECT CepTel
        ,(
            SELECT TOP 1 sa1.SirketAdi
            FROM SatisTum sa1
            WHERE s.MusteriNo = sa1.MusteriNo
            ) s1
        ,(
            SELECT TOP 1 sa2.FaturaSahibi
            FROM SatisTum sa2
            WHERE s.MusteriNo = sa2.MusteriNo
            ) s2
        ,(
            SELECT TOP 1 sa3.Ad
            FROM SatisTum sa3
            WHERE s.MusteriNo = sa3.MusteriNo
            ) s3
        ,(
            SELECT TOP 1 sa4.Soyad
            FROM SatisTum sa4
            WHERE s.MusteriNo = sa4.MusteriNo
            ) s4
        ,MusteriNo
    FROM SatisTum s
    ) T
GROUP BY T.CepTel
    ,T.s1
    ,T.s2
    ,T.s3
    ,T.s4
HAVING Count(DISTINCT T.MusteriNo) > 1
ORDER BY COUNT(DISTINCT T.MusteriNo)

【讨论】:

    【解决方案5】:

    试试这个,

    Select CepTel , 
        MusteriNo,
        MAX(s.SirketAdi)  s1,    -- you are getting random top 1, let it be the max or min!
        MAX(s.FaturaSahibi) s2 , 
        MAX(s.Ad)  s3, 
        MAX(s.Soyad) s4, 
        Count(Distinct MusteriNo) 
    From SatisTum s 
    group by  CepTel ,MusteriNo
    having Count(Distinct MusteriNo) > 1 
    order by COUNT(distinct MusteriNo)
    

    【讨论】:

      【解决方案6】:

      我认为您正在尝试从同一张表 SatisTum 中获取数据。 您可以像下面这样简化您的查询。

      SELECT a.CepTel,t.SirketAdi,t.FaturaSahibi,t.Ad,t.Soyad,Count(Distinct a.MusteriNo) 
      FROM SatisTum  a
        OUTER APPLY  (SELECT top 1 b.SirketAdi,b.FaturaSahibi,b.Ad,b.Soyad FROM SatisTum b WHERE a.MusteriNo = b.MusteriNo )t
      GROUP BY CepTel,t.SirketAdi,t.FaturaSahibi,t.Ad,t.Soyad
      HAVING Count(DISTINCT a.MusteriNo) > 1 
      ORDER BY COUNT(DISTINCT a.MusteriNo);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多