如何过滤合并列的值的分组查询?
问题描述:
这里是我的查询不起作用,因为它显然违反了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'
答
...
and COALESCE(Publisher.name, Affiliate.name) ='AdsMain LLC'
...
列别名只允许在ORDER BY。您必须在WHERE,GROUP BY,HAVING等中使用表达式(用于生成别名列),但您已经按照预期在GROUP BY中使用了表达式。
某些DBMS允许您在其他地方引用列别名,但不引用SQL Server,我认为它更明显地发生了什么。
或者你可以使用派生表/ CTE方法,并从选择(根据你的自我的答案)
“SELECT语句的逻辑处理顺序”。 ..相反,因为SELECT子句是第8步,所以在该子句中定义的任何列别名或派生列都不能被前面的子句引用。但是,它们可以被后续子句(如ORDER BY子句)引用。请注意,该语句的实际物理执行由查询处理器决定,并且订单可能与此列表不同。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY WITH CUBE或WITH ROLLUP
- HAVING
- (GBN:别名不可用)
- SELECT(GBN:此处生成的别名)
- DISTINCT
- ORDER BY
- TOP
答
如果你需要一个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
+0
提示的快速跟进 - 我实际上得到'无效的列名'Publisher''。 – 2011-05-10 20:04:06
回答我自己的问题 - 身价离开这个向上或我应该删除吗? – 2011-05-05 04:32:08
我会放弃它 - 如果有人遇到同样的问题,他们可能会很高兴找到答案! – 2011-05-05 04:52:17
@marc_s:答案已添加。这是“为什么我不能在WHERE子句中访问我的列别名”的变体“ – gbn 2011-05-05 04:59:04