2017-02-20 21 views
-1

3つの列を持つクエリを作成しようとしています.1つの列はリストを表します.2つの列と3つの列は、特定の日付の前と後のそれぞれの値の合計を表します2つ以上の値を持つ副問い合わせエラー。複数の列を持つケース

SQL Serverはエラーを与え、私は本当にそれを回避する方法がわからない(2つのクエリを作成するよりも除いて...)

SELECT 
    (SELECT 
     PiIndex 
    FROM 
     EleGcImpianti 
    WHERE 
     PiIndex IS NOT NULL) AS Commessa, 
    (SELECT 
     SUM(PrImportoDaFatturare) 
    FROM 
     EleGcPianificazioneRate 
    RIGHT OUTER JOIN 
     EleGcImpianti ON EleGcPianificazioneRate.PrIdImpianto = EleGcImpianti.PiId 
    WHERE 
     (EleGcPianificazioneRate.PrDataFattura <= CONVERT(datetime, '2014-01-01', 102))) AS [Somma Rate], 
    (SELECT 
     SUM(PrPercentualeDaFatturare) 
    FROM 
     EleGcPianificazioneRate 
    RIGHT OUTER JOIN 
     EleGcImpianti ON EleGcPianificazioneRate.PrIdImpianto = EleGcImpianti.PiId 
    WHERE 
     (PrDataFattura > CONVERT(datetime, '2014-01-01', 102))) AS [Somma Percentuale Rate] 
+0

エラーとは何ですか? – MPelletier

+0

あなたのsqlは構文的に無効です。select句はサブクエリでのみ指定できますが、テーブル/ビューは指定しません。 – collapsar

+0

また、私はあなたの最初のサブクエリが複数のレコードを返すと思われます。 – Kostis

答えて

1

あなたが単にEleGcImpiantiからレコードを選択したいと関連したいようですEleGcPianificazioneRateからの金額:

SELECT 
    i.PiIndex, 
    COALESCE(pr.sum_after, 0) AS sum_after_date, 
    COALESCE(pr.sum_before, 0) AS sum_before_date 
FROM EleGcImpianti i 
LEFT JOIN 
(
    SELECT 
    PrIdImpianto, 
    SUM(CASE WHEN PrDataFattura <= '20140101' THEN PrImportoDaFatturare END) AS sum_after, 
    SUM(CASE WHEN PrDataFattura > '20140101' THEN PrImportoDaFatturare END) AS sum_before 
    FROM EleGcPianificazioneRate 
    GROUP BY PrIdImpianto 
) pr ON pr.PrIdImpianto = i.PiId 
WHERE i.PiIndex IS NOT NULL 
+0

はい。それは、ありがとう! 1つのこと:私はあなたのクエリSQLを使用しようとすると** "相関名 '私は' FROM句で複数回指定されています" **何が間違っていますか? – Etater

+0

私は 'pr'を 'i'に変更しました。感謝!!!!! SELECT i.PiIndex、 COALESCE(pr.sum_after、0)AS sum_after_date、 COALESCE(pr。sum_before、0)AS sum_before_date EleGcImpiantiから私は LEFT 、JOIN( が PrIdImpianto、SUM(CASEを選択するとPrDataFattura <= '20140101' をPrImportoDaFatturare END)AS sum_after、 SUM(CASE WHEN PrDataFattura> '20140101' をPrImportoDaFatturare END )AS sum_before 投稿者ElevcPianificazioneRate GROUP BY PrIdImpianto)AS pr.PrIdImpianto = i.PiId ここでi.PiIndexはNULLではありません – Etater

+0

これは申し訳ありません。 –

0

あなたのクエリは構文的に無効です。SQL:結果を収集するテーブル/ビューはありません(サブクエリとは別に)。

次の(未テスト)クエリ...

  • ...各取るに足らないからsummarionsのベース値を削除...カットオフ日付条件
  • 由来するインジケータ変数after_cutoffを定義回
  • グローバル合計を実行します
  • は、この情報を使用してPiIndex列を無視しますが、データの集計はデータの分割の一部を形成する場合にのみ意味があります。

これは、集計結果を含む単一のレコードを生成するはずです。

値を選択的に合計するための共通SQLイディオムは、group by句です。しかし、結果にはそれぞれの「面白い」日時間隔の集計結果が含まれます。あなたが本当に2つの和が補完日付時刻に適用するかどうかをチェックしたい場合があります勧告につながる

- 列名を使用すると、絶対値を持っているすべての値を合計することを示唆しているとすべての日付のパーセンテージ(または少なくとも同じ期間)。

select sum(sq2.base_sum_rate)  AS [Somma Rate] 
     , sum(sq2.base_sum_pct_rate) AS [Somma Percentuale Rate] 
     from ( 
       select sq1.after_cutoff 
        , sq1.PrImportoDaFatturare  * (1 - sq1.after_cutoff) base_sum_rate 
        , sq1.PrPercentualeDaFatturare * sq1.after_cutoff  base_sum_pct_rate 
       from (
           select * 
            , CASE WHEN EleGcPianificazioneRate.PrDataFattura <= CONVERT(DATETIME, '2014-01-01', 102) THEN 0 ELSE 1 END after_cutoff 
           from EleGcPianificazioneRate 
         RIGHT OUTER JOIN EleGcImpianti ON EleGcPianificazioneRate.PrIdImpianto = EleGcImpianti.PiId 
           where EleGcImpianti.PiIndex IS NOT NULL 
        ) sq1 
      ) sq2 
     ; 
関連する問題