0

私は、12 か月間のすべての顧客の月間総売上高と総返送額を見つけようとしました。

他の2つのサブクエリを使用すると、クエリは行ごとに26のサブクエリを使用するようになり、SQLステートメントは非常に大きくなります。

次に、販売用と返送用の 2 つのサブセレクトを作成しました...

結果のクエリは短くなりますが、実行時間は 20 ~ 30 倍以上になります。

  1. これは普通ですか
  2. サブクエリが NULL を返す場合、どうすれば 0 を返すことができますか?

編集:

(Select sum(chh2.cha_meblag)
 from dbo.CARI_HESAP_HAREKETLERI chh2
 where chh2.cha_normal_Iade=1 and
       chh2.cha_kod=ch.cari_kod and
       (chh2.cha_tarihi>='20130101' and chh2.cha_tarihi<='20130131')
) as Ocai
4

2 に答える 2

1

サブクエリに基づいて、相関サブクエリを使用せずに結合のみを使用して問題を解決できるようです。ただし、クエリの一部しか操作できないため、確認するのは困難です。これが、質問を投稿する際に、できるだけ多くの関連コードを投稿することをお勧めする理由です。それにもかかわらず、私が収集したものから、あなたは次のようなものを持っています:

SELECT  (   SELECT  SUM(chh2.cha_meblag)
            FROM    dbo.CARI_HESAP_HAREKETLERI chh2
            WHERE   chh2.cha_normal_Iade = 1 
            AND     chh2.cha_kod = ch.cari_kod
            AND     chh2.cha_tarihi >= '20130101' 
            AND     chh2.cha_tarihi <= '20130131'
        ) AS Ocai,
        (   SELECT  SUM(chh2.cha_meblag)
            FROM    dbo.CARI_HESAP_HAREKETLERI chh2
            WHERE   chh2.cha_normal_Iade = 1 
            AND     chh2.cha_kod = ch.cari_kod
            AND     chh2.cha_tarihi >= '20130201' 
            AND     chh2.cha_tarihi <= '20130228'
        ) AS Ocai,
        ... etc for 12 months
FROM    SomeTable ch

これを次のように変えることができます:

SELECT  ch.cari_kod,
        [20130101] = ISNULL([20130101], 0),
        [20130201] = ISNULL([20130201], 0),
        [20130301] = ISNULL([20130301], 0),
        [20130401] = ISNULL([20130401], 0),
        [20130501] = ISNULL([20130501], 0),
        [20130601] = ISNULL([20130601], 0),
        [20130701] = ISNULL([20130701], 0),
        [20130801] = ISNULL([20130801], 0),
        [20130901] = ISNULL([20130901], 0),
        [20131001] = ISNULL([20131001], 0),
        [20131101] = ISNULL([20131101], 0),
        [20131201] = ISNULL([20131201], 0)
FROM    SomeTable
        LEFT JOIN
        (   SELECT  chh2.cha_kod,
                    [20130101] = SUM(CASE WHEN chh2.cha_tarihi >= '20130101' AND chh2.cha_tarihi < '20130201' THEN chh2.cha_meblag ELSE 0 END),
                    [20130201] = SUM(CASE WHEN chh2.cha_tarihi >= '20130201' AND chh2.cha_tarihi < '20130301' THEN chh2.cha_meblag ELSE 0 END),
                    [20130301] = SUM(CASE WHEN chh2.cha_tarihi >= '20130301' AND chh2.cha_tarihi < '20130401' THEN chh2.cha_meblag ELSE 0 END),
                    [20130401] = SUM(CASE WHEN chh2.cha_tarihi >= '20130401' AND chh2.cha_tarihi < '20130501' THEN chh2.cha_meblag ELSE 0 END),
                    [20130501] = SUM(CASE WHEN chh2.cha_tarihi >= '20130501' AND chh2.cha_tarihi < '20130601' THEN chh2.cha_meblag ELSE 0 END),
                    [20130601] = SUM(CASE WHEN chh2.cha_tarihi >= '20130601' AND chh2.cha_tarihi < '20130701' THEN chh2.cha_meblag ELSE 0 END),
                    [20130701] = SUM(CASE WHEN chh2.cha_tarihi >= '20130701' AND chh2.cha_tarihi < '20130801' THEN chh2.cha_meblag ELSE 0 END),
                    [20130801] = SUM(CASE WHEN chh2.cha_tarihi >= '20130801' AND chh2.cha_tarihi < '20130901' THEN chh2.cha_meblag ELSE 0 END),
                    [20130901] = SUM(CASE WHEN chh2.cha_tarihi >= '20130901' AND chh2.cha_tarihi < '20131001' THEN chh2.cha_meblag ELSE 0 END),
                    [20131001] = SUM(CASE WHEN chh2.cha_tarihi >= '20131001' AND chh2.cha_tarihi < '20131101' THEN chh2.cha_meblag ELSE 0 END),
                    [20131101] = SUM(CASE WHEN chh2.cha_tarihi >= '20131101' AND chh2.cha_tarihi < '20131201' THEN chh2.cha_meblag ELSE 0 END),
                    [20131201] = SUM(CASE WHEN chh2.cha_tarihi >= '20131201' AND chh2.cha_tarihi < '20140101' THEN chh2.cha_meblag ELSE 0 END)
            FROM    dbo.CARI_HESAP_HAREKETLERI chh2
            WHERE   chh2.cha_normal_Iade = 1 
            GROUP BY chh2.cha_kod
        ) chh2
            ON chh2.cha_kod = ch.cari_kod;

これにはサブクエリさえ必要ないかもしれませんが、私が言ったように、完全なクエリがなければ、テーブル構造と実際に必要な結果について推測することしかできません。

1 と答えるには、UDF が同じことを行うサブクエリよりもパフォーマンスが悪いのは普通のことです。件名に関する投稿が多数あります SQL-Server UDF vs subqueryを検索したとき、この回答はグーグルのトップでした

于 2013-06-10T12:24:30.980 に答える
1

2 番目の質問に対する答えは、サブクエリを次のようにラップすることcoalesce()です。

coalesce((Select sum(chh2.cha_meblag)
          from dbo.CARI_HESAP_HAREKETLERI chh2
          where chh2.cha_normal_Iade=1 and
                chh2.cha_kod=ch.cari_kod and
                (chh2.cha_tarihi>='20130101' and chh2.cha_tarihi<='20130131')
         ), '') as Ocai

マーティンがコメントで指摘してcoalesce()いるように、SQL Server のバグと思われるものがあります。この場合、最初の式を 2 回実行します。1 回目は値をチェックしNULL、2 回目は値を取得します。これを考えると、ISNULL()より良いです(私は一般的に標準関数を好みますが):

isnull((Select sum(chh2.cha_meblag)
          from dbo.CARI_HESAP_HAREKETLERI chh2
          where chh2.cha_normal_Iade=1 and
                chh2.cha_kod=ch.cari_kod and
                (chh2.cha_tarihi>='20130101' and chh2.cha_tarihi<='20130131')
         ), '') as Ocai
于 2013-06-10T11:27:39.833 に答える