sql >> データベース >  >> RDS >> Database

SQLCOALESCE関数の実用的な使用

    この記事では、いくつかのプロのライフシナリオに関するSQLCOALESCE関数の実際の使用について説明します。これは、データベース関連の問題に対処するために、この関数を正しく時間内に使用することの重要性を強調しています。

    さらに、この関数を使用して、問題を解決するために必要な特定の手順を実装します。

    前提条件

    この記事の今後の例を確認して実装する準備をする前に、次の問題に精通することを強くお勧めします。

    • T-SQLの基本 。読者はT-SQLスクリプトをよく知っている必要があります。また、サンプルデータベースに対してSQLクエリを快適に記述して実行する必要があります。
    • COALESCE機能の基本 。読者はこの分野に精通している必要があります。それを研究するための情報が必要な場合は、記事SQLCOALESCE関数がNULL値を効果的に処理するを参照してください。 。

    サンプルデータベース

    CoalesceUseDBというサンプルデータベースを設定します 次のように:

    -- Setup sample database
    Create DATABASE CoalesceUseDB;
    GO
    

    または、 tempdbに対してクエリを実行することもできます。 必要に応じてデータベース。

    実用的な考え方

    COALESCE関数の2つの実用的なユースケースを確認します。 この関数の主な目的は、渡される入力(パラメーター)のリストから最初のNon-Null値を返すことです。 –パラメータは列にすることもできます。

    このようなシナリオへのアプローチの1つは、複数の列を含むストレージ構造(テーブル)を使用することです。意味のある情報を作成するには、これらの列の1つだけを入力する必要があります。

    それでは、実際の使用法を見ていきましょう。

    ウェブホスティングサブスクリプションシナリオ

    ここでは、(有料の)サービスが一部の顧客によって使用されているWebホスティングサービスプロバイダーについて考えます。顧客は、月次、四半期、または年次のいずれかの方法で支払うことを選択できます。

    さて、お客様は10月上旬に支払いを済ませたと思います。したがって、データベースの観点から表形式の構造を次のように視覚化します。

    注文を保存するためのテーブルを作成する

    サンプルデータベースに対して利用可能な支払いオプションのいずれかを介して顧客が行ったすべての注文を保存するためのテーブルを作成する必要があります。

    Use CoalesceUseDB
    
    -- Create WebOrder table
    CREATE TABLE [dbo].[WebOrder]
    (
    	[Id] INT NOT NULL, 
    	[Customer] VARCHAR(40) NOT NULL, 
        [YearlyPayment] DECIMAL(10,2) NULL, 
        [QuarterlyPayment] DECIMAL(10,2) NULL, 
        [MonthlyPayment] DECIMAL(10,2) NULL, 
        [OrderDate] DATETIME2 NOT NULL, 
        CONSTRAINT [PK_WebOrder] PRIMARY KEY (Id) 
    )
    

    次のようにテーブルにデータを入力します:

    -- Populate WebOrder table
    INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (1, N'Asif', CAST(70.00 AS Decimal(10, 2)), NULL, NULL, N'2020-10-01 00:00:00')
    INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (2, N'Peter', NULL, CAST(35.00 AS Decimal(10, 2)), NULL, N'2020-10-01 00:00:00')
    INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (3, N'Sarah', NULL, NULL, CAST(6.00 AS Decimal(10, 2)), N'2020-10-01 00:00:00')
    

    クイックチェック

    次のT-SQLスクリプトを実行して、テーブルをざっと見てください。

    -- View WebOrder table
    SELECT wo.Id,wo.Customer,wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment,wo.OrderDate 
    FROM dbo.WebOrder wo
    

    出力は次のとおりです。

    問題を特定する

    すべて良さそうですが、問題があります。

    毎月、毎年、または四半期ごとに支払いを行ったかどうかに関係なく、すべての顧客の支払いを確認したいと思います。特に、すべての顧客の注文を含むレポートで作業し、毎月、毎年、または四半期ごとに支払ったかどうかを無視する場合は、NULLを回避してこれらすべての支払いを結合する方法はないようです。

    ソリューションの設計

    解決策は、COALESCE関数を使用することです。これらすべての支払いモードを結合し、必須ではないNULL値を除外します。

    これは、次のように簡単に実現できます。

    --View all the web orders regardless of the payment mode
    SELECT wo.Id,wo.Customer,COALESCE(wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment) AS Payment,wo.OrderDate 
    FROM dbo.WebOrder wo
    

    出力は次のとおりです。

    SQLビューを使用したソリューションの改善

    スクリプトをSQLビューに変換し、分析とレポートに再利用することで、このソリューションを改善できます。

    -- Create AllWebOrders view
    CREATE VIEW 
    AllWebOrders
    AS
    SELECT wo.Id,wo.Customer,COALESCE(wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment) AS Payment,FORMAT(wo.OrderDate,'dd-MMM-yyyy') AS OrderDate
    FROM dbo.WebOrder wo
    

    次のようにビューを実行します:

    --Run SQL View to see all the web orders
    SELECT awo.Id,awo.Customer,awo.Payment,awo.OrderDate
    FROM dbo.AllWebOrders awo
    

    結果は次のとおりです。

    ヒント:SQLビューを基になるデータ取得戦略として使用してSSRSレポートを作成できます。

    自己参照組織のシナリオ

    これは、より複雑ですが、より一般的な生活データベース関連のシナリオです。

    それを理解する最も簡単な方法は、階層的な(親子)関係にアピールすることです。ここでは、すべての従業員の記録とその管理者の記録を含む表を検討します。このテーブルには、各マネージャーが同じテーブルの従業員として格納されています。

    ただし、ここでは従業員とマネージャーの表形式の関係に完全に焦点を当てることはしません。

    各組織がマスター組織に属する親子階層について考えてみましょう。マスター組織自体は、自己参照関係を作成するために同じ構造の組織として保存されます。

    これを理解する最良の方法は、構造を構築して自分で確認することです。

    マスターおよびサブ組織を保存するためのテーブルを作成する

    サンプルデータベースにSQLテーブルを作成してデータを入力し、マスターとそのサブ組織を次のように保存します。

    -- Creating master sub organisation table (self-referencing table)
    CREATE TABLE [dbo].[Organisation]
    (
    	[Id] INT NOT NULL , 
        [Name] VARCHAR(40) NULL, 
    	[Articles] INT NULL,
        [MasterId] INT NULL, 
        CONSTRAINT [PK_Organisation] PRIMARY KEY ([Id])
    );
    GO
    
    -- Inserting data into the Organisation table
    -- Populate Organisation table
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles], [MasterId]) VALUES (1,'CodingSight',10, NULL)
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (2, 'SQL Blog', 2,1)
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (3, 'SSRS Blog', 3,1)
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (4,'CodingSight 2',5, NULL)
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (5, 'SSAS Blog', 1,4)
    INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (6,'SSIS Blog', 2,4)
    

    クイックチェックと分析

    次のクエリを実行すると、新しく作成されたテーブルを表示できます。

    -- View Organisation table
    SELECT o.Id,o.Name,o.MasterId
    FROM dbo.Organisation o
    

    次に、次の結果が得られます。

    したがって、次のマスター組織がテーブルに格納されていると推測できます。

    1. CodingSight
    2. CodingSight 2

    MasterId列を見ると、マスター組織にNULLのMasterIdがあることがわかります。それは彼らがマスター組織だからです。

    以下の組織は、CodingSightマスター組織の下にあります。 CodingSightを指すMasterIdがあります 組織:

    1. SQLブログ
    2. SSRSブログ

    CodingSight 2の次のサブ組織についても同じことが言えます。 マスター組織:

    1. SSASブログ
    2. SSISブログ

    問題の説明

    これらの組織によって公開されたすべての記事のレポートを作成する必要があるとします。これには、サブ組織も含まれますが、マスター組織によって表されます。

    簡単に言うと、マスター組織によって公開されたすべての記事を表示するレポートを作成する必要があります。これには、サブ組織によって公開された記事も含まれますが、サブ組織については言及できません。

    ソリューションの設計

    COALESCE関数は、マスター組織でNULLを検出する必要があるため、ここでは非常に便利ですが、マスターとサブ組織を関数に含めることは役に立ちません。

    たとえば、次のようにIDを関数にラップして、記事を要約しようとします。

    -- Getting total articles for each of the master and sub-organization without using COALESCE
    SELECT O.Id,O.MasterId,SUM(O.Articles) as Total_Articles FROM dbo.Organisation O
    GROUP BY O.MasterId,O.Id
    

    出力は次のとおりです。

    ここで、次のように目的の関数を使用して出力を改善しましょう。

    -- Getting total articles for each of the master and sub organizations using COALESCE
    SELECT COALESCE(O.Id,O.MasterId) MasterOrSubId,O.Name,SUM(O.Articles) as Total_Articles FROM dbo.Organisation O
    GROUP BY COALESCE(O.Id,O.MasterId),O.Name
    

    出力は次のとおりです。

    マスターIDとサブ組織IDを正常にマージして、これらの組織によって公開された記事の総数を取得しました。

    記事の数を失うことなくサブ組織を除外する必要があるため、目的の結果を得るには、スクリプトをより複雑にする必要があります。そのカウントは、マスター組織に割り当てる必要があります。

    これを実現するには、次のT-SQLスクリプトを記述します。

    -- Sum of all the articles published by the master organizations and their sub-organizations represented by the master organizations 
    SELECT a.OrgId,o2.Name,a.Total_Articles FROM 
    (SELECT COALESCE(O.MasterId,O.Id) AS OrgId,SUM(Articles) as Total_Articles FROM dbo.Organisation o
    WHERE COALESCE(O.MasterId,O.Id) IN
    (SELECT Id FROM dbo.Organisation where MasterId IS NULL)
    GROUP BY COALESCE(O.MasterId,O.Id)) as a
    INNER JOIN dbo.Organisation o2
    on o2.Id=a.OrgId
    

    出力は次のとおりです。

    おめでとう!いくつかの興味深いリアルタイムシナリオに関して、COALESCE関数の実際の使用法を学ぶことに成功しました。

    やるべきこと

    NULL値を効果的に処理し、NULL値に関する複雑な問題を解決できるようになったので、ビジネス要件に従って置き換える必要があります。スキルをさらに向上させるために、次のことを試してみましょう。

    1. 自己参照組織シナリオのSQLビューを作成して実行してみてください:
    2. 簡単な用語でのSSRSレポートの開発を参照してください 記事を作成し、ウェブホスティングシナリオのレポートを作成します。
    3. WebOrderにデータを追加します 異なるOrderDateを指定してテーブルを作成します Webホスティングサービスのシナリオで言及されている値。次に、SQLビューを OrderDateを受け入れるストアドプロシージャに変換します。 パラメータ。
    4. ストアドプロシージャに基づいたプロフェッショナルSSRSレポートの作成を参照してください。 前のポイントで説明した変更されたシナリオの記事を作成し、注文日ベースのレポートを作成します。

    また読む

    SQLCOALESCE関数に関する5つの質問に対する上位の回答

    初心者向けのSQLCOALESCE関数を使用したNULL値の効果的な処理


    1. PostgresUUIDJDBCが機能しない

    2. 子供のパーティーのデータモデル

    3. PL / SQLプロシージャをオンラインで生成して、Oracleテーブルにデータをインポートします

    4. SQL Server IndyPassを使用したMicrosoftAccessの最適化– 5/21/19