2

SQL Server 2008 R2 に 2 つのテーブルがあります。

Store:                      Record:
--------------              ------------------------
Shape       ID              PickedShape     Finished
Circle      1               Circle          Y
Circle      2               Circle          N
Circle      3               Square          N
Square      1               Square          N
Square      2               Oval            Y
Triangle    1               Oval            Y

可能なすべての形状とその数を 2 つのテーブルに出力する SQL クエリを作成したいと考えています。次のように、ばかげた方法で書くことができます

select 
    'Circle', (select count(1) from Store where Shape = 'Circle'), 
    (select count(1) from Record where PickedShape = 'Circle'), 
    (select count(1) from Record where Finished = 'Y' and PickedShape = 'Circle') 
UNION
select 
    'Square', (select count(1) from Store where Shape = 'Square'), 
    (select count(1) from Record where PickedShape = 'Square'), 
    (select count(1) from Record where Finished = 'Y' and PickedShape = 'Square') 
UNION...

続けますが、それはばかげて効率的ではありません。

より賢い方法は、group by を使用することだと思います。スプーンで食べさせるのが苦手な人もいるかもしれないので、私が試したのはこちら

SELECT 
    Shape, COUNT(Shape) AS Available, Picked, Finished
FROM 
    Store 
FULL JOIN 
    (SELECT PickedShape, COUNT(1) As Picked, SUM(CASE WHEN Finished='Y' THEN 1 ELSE 0 END) AS Finished 
     FROM Record 
     GROUP BY PickedShape) t2 ON Store.Shape = t2.PickedShape
GROUP BY 
    Shape, Picked, Finished

そして出力は

Shape   Available   Picked  Finished
NULL        0       2       2
Circle      3       2       1
Square      2       2       0
Triangle    1       NULL    NULL

どこに問題があるかがわかります。

まず、NULL ではなく Shape の下に「Oval」を配置します。FULL JOIN を使用すると、両方のテーブルのすべてのバリエーションが表示されますが、表示されません...

2 番目に、欠落している NULL ではなく Picked と Finished を 0 と表示するようにします。

第三に、可能であれば SQL をより効率的にしたいと考えています。

それらの問題をどのように解決しますか?

ありがとうございました!

4

1 に答える 1

1

クエリを少し変更しました最初のクエリでShapeでグループ化しましたが、最初のクエリに「楕円形」が存在しません。したがって、Shapeは派生クエリから受け取ります。三角形は派生クエリに存在しないため、その数量は0になります。

SELECT 
  COALESCE(Shape, t2.PickedShape) AS Shape, COUNT(Shape) AS Available,
  ISNULL(Picked, 0) AS Picked, ISNULL(Finished, 0) AS Finished
FROM 
 Store 
FULL JOIN 
  (SELECT PickedShape, COUNT(1) As Picked, SUM(CASE WHEN Finished='Y' THEN 1 ELSE 0 END) AS Finished 
   FROM Record 
   GROUP BY PickedShape) t2 ON Store.Shape = t2.PickedShape
GROUP BY 
  Shape, t2.PickedShape, Picked, Finished
于 2012-11-09T07:41:50.163 に答える