Sql 如何根据合并列的值按查询筛选组?

Sql 如何根据合并列的值按查询筛选组?,sql,tsql,group-by,coalesce,having,Sql,Tsql,Group By,Coalesce,Having,我的查询不起作用,因为它显然违反了HAVING子句的规则: SELECT COALESCE(Publisher.name, Affiliate.name) AS Publisher ,dbo.SumKeys(Item.id) AS ItemIDs FROM Item INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id I

我的查询不起作用,因为它显然违反了HAVING子句的规则:

SELECT
      COALESCE(Publisher.name, Affiliate.name) AS Publisher
     ,dbo.SumKeys(Item.id) AS ItemIDs
FROM
    Item
    INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
    INNER JOIN Affiliate ON Item.affid = Affiliate.affid
    INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
    INNER JOIN Campaign ON Item.pid = Campaign.pid
    INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
    LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
GROUP BY
     COALESCE(Publisher.name, Affiliate.name)
    ,ItemAccountingStatus.name
    ,CampaignStatus.name    
HAVING (
    ItemAccountingStatus.name='default'
    and CampaignStatus.name='Verified'
    and Publisher='AdsMain LLC' -- THIS BREAKS THE QUERY
)
问题:有没有办法做到这一点

SELECT * FROM
(
    SELECT
          COALESCE(Publisher.name, Affiliate.name) AS Publisher
         ,dbo.SumKeys(Item.id) AS ItemIDs
    FROM
        Item
        INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
        INNER JOIN Affiliate ON Item.affid = Affiliate.affid
        INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
        INNER JOIN Campaign ON Item.pid = Campaign.pid
        INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
        LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
    GROUP BY
         COALESCE(Publisher.name, Affiliate.name)
        ,ItemAccountingStatus.name
        ,CampaignStatus.name    
    HAVING (
        ItemAccountingStatus.name='default'
        and CampaignStatus.name='Verified'
    )
) A
WHERE A.Publisher='AdsMain LLC'
列别名仅在ORDER BY中允许。必须在WHERE、GROUP BY、HAVING等中使用表达式(生成别名列)。您已经按照预期在GROUP BY中使用了该表达式

有些DBMS允许您在其他地方引用列别名,但不允许在SQL Server中引用列别名,我认为这使发生的事情更加明显

或者,您可以使用派生表/CTE方法,并从中进行选择(根据您的自我回答)

根据“SELECT语句的逻辑处理顺序”

…相反,由于SELECT子句是步骤8,因此前面的子句不能引用该子句中定义的任何列别名或派生列。但是,它们可以由后续的子句(如ORDER by子句)引用。请注意,语句的实际物理执行由查询处理器决定,并且顺序可能与此列表不同

  • 加入
  • 在哪里
  • 分组
  • 使用多维数据集还是使用汇总
  • 有(gbn:别名不可用)
  • 选择(gbn:此处生成的别名)
  • 明显的
  • 订购人

  • 我怀疑您是否需要having子句-请在下面的where子句中尝试

    SELECT
          COALESCE(Publisher.name, Affiliate.name) AS Publisher
         ,dbo.SumKeys(Item.id) AS ItemIDs
    FROM
        Item
        INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
        INNER JOIN Affiliate ON Item.affid = Affiliate.affid
        INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
        INNER JOIN Campaign ON Item.pid = Campaign.pid
        INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
        LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
    where 
        ItemAccountingStatus.name='default'
        and CampaignStatus.name='Verified'
        and Publisher='AdsMain LLC' 
    GROUP BY
         COALESCE(Publisher.name, Affiliate.name)
        ,ItemAccountingStatus.name
        ,CampaignStatus.name    
    

    回答了我自己的问题-值得保留还是应该删除?我会保留-如果其他人遇到相同的问题,他们可能会很高兴找到答案@马克:补充回答。它是“为什么我不能在WHERE子句中访问我的列别名”的变体,或者您可以简单地添加
    并合并(Publisher.name、Affiliate.name)='AdsMain LLC'
    添加到Having子句中,而不是使用派生表。更好的做法是按照josephj1989quick follow的建议,将其添加到Where子句中-我实际上得到了“无效列名”Publisher“”。
    SELECT
          COALESCE(Publisher.name, Affiliate.name) AS Publisher
         ,dbo.SumKeys(Item.id) AS ItemIDs
    FROM
        Item
        INNER JOIN ItemAccountingStatus ON Item.item_accounting_status_id = ItemAccountingStatus.id
        INNER JOIN Affiliate ON Item.affid = Affiliate.affid
        INNER JOIN Currency AffiliateCurrency ON Affiliate.currency_id = AffiliateCurrency.id
        INNER JOIN Campaign ON Item.pid = Campaign.pid
        INNER JOIN CampaignStatus ON Campaign.campaign_status_id = CampaignStatus.id
        LEFT OUTER JOIN Publisher ON Affiliate.affid = Publisher.affid
    where 
        ItemAccountingStatus.name='default'
        and CampaignStatus.name='Verified'
        and Publisher='AdsMain LLC' 
    GROUP BY
         COALESCE(Publisher.name, Affiliate.name)
        ,ItemAccountingStatus.name
        ,CampaignStatus.name