7

OK-私はたくさんの例を見て、見て、見つけましたが、私のニーズを完全に満たすものは何もありません。間違った単語を使って検索したのかもしれませんが、あなたの助けを借りることはできます。できるだけ詳しく説明します。

2つのテーブル、つまりビューとテーブルのフィールドを1つのテーブルにマージしてレポートを作成するレポートを作成する必要があります。これが私が使用しているステートメントです:

SELECT A.ConfInt, A.Conference, 
        NULL as Ordered,
        NULL as Approved,
        NULL as PickedUp,
        SUM(dbo.Case_Visit_Payments.Qty) AS Qty
FROM         dbo.Conferences as A INNER JOIN
                      dbo.Case_Table ON A.ConfInt = dbo.Case_Table.Conference_ID INNER JOIN
                      dbo.Case_Visit_Payments ON dbo.Case_Table.Case_ID = dbo.Case_Visit_Payments.Case_ID
WHERE     (dbo.Case_Visit_Payments.Item_ID = 15 AND A.ProjectCool = 1)
GROUP BY A.Conference, A.ConfInt
UNION
SELECT  B.ConfInt, 
        B.Conference, 
        SUM(dbo.Cool_Fan_Order.NumberOfFansRequested) AS Ordered, 
        SUM(dbo.Cool_Fan_Order.Qty_Fans_Approved) AS Approved, 
        SUM(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) AS PickedUp, 
        NULL AS Qty
FROM         dbo.Conferences as B LEFT OUTER JOIN
                      dbo.Cool_Fan_Order ON B.ConfInt = dbo.Cool_Fan_Order.Conference_ID
where B.ProjectCool = 1
GROUP BY B.Conference, B.ConfInt

そしてここに結果があります:

4   Our Lady        NULL    NULL    NULL    11
4   Our Lady        40      40      40      NULL
7   Holy Rosary     20      20      20      NULL
11  Little Flower   NULL    NULL    NULL    21
11  Little Flower   5       5       20      NULL
19  Perpetual Help  NULL    NULL    NULL    2
19  Perpetual Help  20      20      20      NULL

私が強く望んでいるのは、次のような重複する行を持たないことです。

4   Our Lady        40      40      40      11
7   Holy Rosary     20      20      20      NULL
11  Little Flower   5       5       20      21
19  Perpetual Help  20      20      20      2

この質問が十分に明確であったことを願っています。任意の提案をいただければ幸いです。そして、私は回答済みとしてマークします。:)

グレゴリー

4

3 に答える 3

6

実際のクエリをサブクエリとして使用し、重複していない値に対して集計関数(MAX OR SUM)を使用し、集計されていない列でグループ化することができます

SELECT ConfInt, Conference, MAX(Ordered), MAX(Approved), MAX(PickedUp), MAX(Qty)
FROM (<your actualQuery>)
GROUP BY ConfInt, Conference.
于 2012-06-22T15:25:40.687 に答える
5

簡単な答えは、クエリを別のクエリにラップすることです。

SELECT ConfInt
     , Conference
     , SUM(Ordered) AS Ordered
     , SUM(Approved) As Approved
     , SUM(PickedUp) AS PickedUp
     , SUM(Qty) AS Qty
  FROM (

       <your UNION query here>  

      )
 GROUP BY ConfInt, Conference

これは結果セットを達成する唯一の方法ではありませんが、指定された要件を満たすための最も迅速な修正です。

別の方法として、これらのクエリは同等の結果を返すと思います。

SELECTリストで相関サブクエリを使用して数量を取得できます。

;WITH q AS
      ( SELECT B.ConfInt
             , B.Conference
             , SUM(o.NumberOfFansRequested) AS Ordered
             , SUM(o.Qty_Fans_Approved) AS Approved
             , SUM(o.Qty_Fans_PickedUp) AS PickedUp
          FROM dbo.Conferences as B
          LEFT
          JOIN dbo.Cool_Fan_Order o ON o.Conference_ID = B.ConfInt
         WHERE B.ProjectCool = 1
         GROUP BY B.ConfInt, B.Conference
      )
 SELECT q.ConfInt
      , q.Conference
      , q.Ordered
      , q.Approved
      , q.PickedUp
      , ( SELECT SUM(v.Qty)
            FROM dbo.Case_Table t
            JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID
           WHERE t.Conference_ID = q.ConfInt
             AND v.Item_ID = 15
        ) AS Qty
   FROM q
  ORDER BY q.ConfInt, q.Conference

または、UNIONではなく、2つのクエリでLEFTJOIN操作を使用することもできます。(Cool_Fan_Orderを参照するクエリは、少なくとも他のクエリと同じ数の行を返すことがわかっているため、外部結合の左側になる可能性があります。(基本的に、他のクエリはConfIntの値を返すことができないことがわかっています。およびCool_Fan_Orderクエリに含まれていない会議。)

;WITH p AS 
      ( SELECT A.ConfInt
             , A.Conference
             , SUM(v.Qty) AS Qty
          FROM dbo.Conferences as A
          JOIN dbo.Case_Table t ON t.Conference_ID = A.ConfInt
          JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID
         WHERE A.ProjectCool = 1
           AND v.Item_ID = 15
         GROUP BY A.ConfInt, A.Conference
      )
    , q AS
      ( SELECT B.ConfInt
             , B.Conference
             , SUM(o.NumberOfFansRequested) AS Ordered
             , SUM(o.Qty_Fans_Approved) AS Approved
             , SUM(o.Qty_Fans_PickedUp) AS PickedUp
          FROM dbo.Conferences as B
          LEFT
          JOIN dbo.Cool_Fan_Order o ON B.ConfInt = o.Conference_ID
         WHERE B.ProjectCool = 1
         GROUP BY B.ConfInt, B.Conference
      )
 SELECT q.ConfInt
      , q.Conference
      , q.Ordered
      , q.Approved
      , q.PickedUp
      , p.Qty
   FROM q
   LEFT
   JOIN p ON p.ConfInt = q.ConfInt AND p.Conference = q.Conference
  ORDER BY q.ConfInt, q.Conference

これら3つの中から選択すると(すべての条件で同等の結果セットが返されます)、読みやすさと保守性、およびパフォーマンスに要約されます。十分な大きさの行セットでは、3つのステートメントの間にいくつかの観察可能なパフォーマンスの違いがある場合があります。

于 2012-06-22T15:28:41.460 に答える
0

最初の選択でCool_Fan_Orderに結合を配置し、ユニオンを削除します。

これは同じ結果を返しますか?

 select
        A.ConfInt,
        A.Conference,
        sum(dbo.Cool_Fan_Order.NumberOfFansRequested) as Ordered,
        sum(dbo.Cool_Fan_Order.Qty_Fans_Approved) as Approved,
        sum(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) as PickedUp,
        sum(sub.Qty) as Qty
    from
        dbo.Conferences as A
        left outer join 
        (
            select
                c.ConfInt,
                cvp.Qty
            from dbo.Conferences c
                inner join dbo.Case_Table ct
                    on a.confInt=ct.Conference_ID
                inner join dbo.Case_Visit_Payments cvp
                    on ct.Case_ID=cvp.Case_ID
            where cvp.Item_ID=15
        ) sub
            on a.ConfInt=sub.ConfInt
        left outer join dbo.Cool_Fan_Order
            on A.ConfInt = dbo.Cool_Fan_Order.Conference_ID
    where
        (
         A.ProjectCool = 1
        )
    group by
        A.Conference,
        A.ConfInt
于 2012-06-22T16:24:40.963 に答える