Sql 如何根据合并列的值按查询筛选组?
我的查询不起作用,因为它显然违反了HAVING子句的规则: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
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子句)引用。请注意,语句的实际物理执行由查询处理器决定,并且顺序可能与此列表不同
我怀疑您是否需要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