簡體   English   中英

如何根據合並列的值過濾分組查詢?

[英]How do I filter a group-by query on the value of a coalesced column?

這是我的查詢不起作用,因為它顯然違反了 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
)

問題:有沒有辦法做到這一點?

我懷疑你是否需要一個有子句 - 在下面的 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    
...
and COALESCE(Publisher.name, Affiliate.name) ='AdsMain LLC'
...

列別名只允許在 ORDER BY 中。 您必須在 WHERE、GROUP BY、HAVING 等中使用表達式(生成別名列)。盡管正如預期的那樣,您已經在 GROUP BY 中使用了表達式。

一些 DBMS 允許您在其他地方引用列別名,但不允許在 SQL 服務器上引用,我認為這讓發生的事情更加明顯。

或者您可以使用派生表/CTE 方法和 SELECT (根據您的自我回答)

根據MSDN上的 SELECT ,“SELECT 語句的邏輯處理順序”

...相反,因為 SELECT 子句是第 8 步,所以在該子句中定義的任何列別名或派生列都不能被前面的子句引用。 但是,它們可以被后續子句引用,例如 ORDER BY 子句。 請注意,語句的實際物理執行由查詢處理器確定,並且順序可能與此列表不同。

  1. 加入
  2. 在哪里
  3. 通過...分組
  4. WITH CUBE 或 WITH ROLLUP
  5. HAVING(gbn:別名不可用)
  6. SELECT(gbn:此處生成的別名)
  7. 清楚的
  8. 訂購方式
  9. 最佳
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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM