簡體   English   中英

在案例陳述中使用計數

[英]Using a count in a case statement

我需要一些幫助,我正在使用以下SQL創建視圖:

SELECT 

         TNTTITLE.Description_VC AS TITLE
        ,TNTCONTACT.Forename_VC AS FORENAME
        ,TNTCONTACT.Surname_VC AS SURNAME
        ,TNTCONTACTEMAIL.Reference_VC AS EMAIL  
        ,TNTHOMENUMBER_GRP.Reference_VC AS GROUP_HOME_NUMBER
       ,RENTACC.ID AS RENT_ACCOUNT_ID
       ,CONVERT(DATE,RENTACC.AccountStartDate) AS RENT_ACCOUNT_START_DT
       ,CASE
            WHEN LETOFFERS.Current_Status_ID = 42 THEN 'Complete'
        ELSE 'OTHER'
        END 
            AS STATUS
        ,ASSETTYPES.Description_VC AS ASSET_NAME
        ,CASE WHEN (SELECT MainAsset FROM RENTACC HAVING COUNT(*) > 1) THEN 1 ELSE 0 END


FROM RENT_ACCOUNTS AS RENTACC

        INNER JOIN LETTING_OFFERS_T AS LETOFFERS
            ON RENTACC.ID = LETOFFERS.Rent_Account_Reference_VC
                AND RENTACC.AccountEndDate IS NULL
                AND RENTACC.AccountType = 'T'

        LEFT JOIN Letting_SYS_Master_T AS LETCODES
            ON LETOFFERS.Current_Status_ID = LETCODES.CODE_ID
                AND LETCODES.Type_ID = '14'

        LEFT JOIN Asset_Assets_T AS ASSETS
            ON RENTACC.MainAsset = ASSETS.Asset_ID

        LEFT JOIN Asset_Types_T AS ASSETTYPES
            ON ASSETS.Asset_TYPE_ID = ASSETTYPES.Asset_Type_ID


        /**** MAIN CONTACT INFORMATION ****/

        LEFT JOIN Shared_Addresses_T AS TNTADDRESS
            ON ASSETS.Address_ID = TNTADDRESS.Address_ID

        LEFT JOIN Contact_Group_Contacts_T AS TNTGROUP
            ON RENTACC.ContactDatabaseReference = TNTGROUP.GROUP_ID
                AND TNTGROUP.Main_Group_Contact_BT = 1
                AND TNTGROUP.Removed_BT = 0

        LEFT JOIN CONTACT_CONTACTS_T AS TNTCONTACT
            ON TNTGROUP.Contact_ID = TNTCONTACT.Contact_ID
                AND TNTCONTACT.Current_Status_ID = 65
                AND TNTCONTACT.Deceased_Date_DT IS NULL 

        LEFT JOIN Shared_Codes_T AS TNTTITLE
            ON TNTCONTACT.Title_Code_ID = TNTTITLE.Code_ID
                AND TNTTITLE.Code_ID IN (103,104,105,106)

        /**** CONTACT EMAIL INFORMATION ****/

        LEFT JOIN Contact_Contact_Details_T AS TNTCONTACTEMAIL
            ON TNTCONTACT.Contact_ID = TNTCONTACTEMAIL.Contact_ID
                AND TNTCONTACTEMAIL.SYS_Number_Code_ID = 75
                AND TNTCONTACTEMAIL.Expiry_Date_DT IS NULL


        /**** GROUP HOME NUMBER INFORMATION  ****/

        LEFT JOIN Contact_Group_Details_T AS TNTHOMENUMBER_GRP
            ON RENTACC.ContactDatabaseReference = TNTHOMENUMBER_GRP.Group_ID
                AND TNTHOMENUMBER_GRP.Expiry_Date_DT IS NULL
                AND TNTHOMENUMBER_GRP.SYS_Number_Code_ID = 71

我試圖在一個case語句中進行計數,以顯示rentacc表中出現多次的所有MainAsset代碼都顯示為“ 1”,而僅顯示一次的任何mainasset代碼都顯示為“ 0”。 但這是行不通的。 但我也想在完整的rentacc表(為rent_accounts表使用別名)中執行此操作,因為RENTACC只是視圖的別名。

例如:

RENT_ACCOUNTS表

Main Asset- 
1234 
1234 
1000 
1234

我想在視圖(RENT VIEW)中顯示的內容如下:

main asset, case
1234, 1
1000, 0

無論如何,由於我得到的案例陳述不起作用,我可以這樣做嗎?

謝謝,丹

您可以將案例改寫為

CASE WHEN count(MainAsset) > 1 THEN 1 ELSE 0 END

但您必須將選擇的所有其他列添加到group by子句。

您可以使用一個exists()編寫case表達式,如下所示:

, case when exists (
      select 1 
      from RENT_ACCOUNTS as i 
      where i.MainAsset = RENTACC.MainAsset
      group by i.MainAsset
      having count(*) > 1
    ) 
      then 1 
    else 0 
    end as Multi_MainAsset

取決於您的平台,最好使用子查詢來獲得帶有count(*) over() RENTACC

select ...
  , case when MainAssetCount > 1 then 1 else 0 end as Multi_MainAsset
from (
  select *
    , count(*) over (partition by MainAsset) as MainAssetCount
  from RENT_ACCOUNTS 
  ) AS RENTACC
...

暫無
暫無

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

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