2

私はテーブルを持っています:

Worker (ID, Name)

Box (ID, Name, ID_Worker)

BoxColor (ID, Name)
BoxSize (ID, Name)

Item(ID, ID_box, ID_BoxColor, ID_BoxSize)

そのため、アイテムを作成して箱に入れる作業員がいます。私の秘密の仕事のために、私はトピックを変更し、私の秘密のものからええとボックスに ;)

列を持つレポートを作成しようとしています:

Worker.Name | BoxSize.Name | BoxColor(id=0) | BoxColor(id=1) | BoxColor(id=2)

テーブル ボックスは他のレポートで使用されるため、このテーブルの構造は変更できます。

たとえば、取得したいのは次のとおりです。

グループ化された Worker Names と各 BoxSize について、すべての色数を列に表示します。例えば:

John | X   | 2 | 4 | 0 |
John | XL  | 5 | 1 | 0 |
John | XXL | 2 | 0 | 0 |
John | S   | 3 | 1 | 0 |
Adam | X   | 5 | 4 | 0 |
Adam | XL  | 1 | 3 | 0 |
Adam | S   | 0 | 1 | 0 |
....

BoxColor はそれほど多くの色を持たないテーブルなので、次のようなさまざまなサブ選択でハードコードすることができます

(select count(*) from BoxColor where ID = 0)
(select count(*) from BoxColor where ID = 1)
(select count(*) from BoxColor where ID = 2)

私はこのようなことをしようとしましたが、クエリはループしており、「思考」を停止することはありません

select Worker.Name, BoxSize.Name,
 (select count(*) from BoxColor as BoxColor2, Box as Box2, Item as Item2 
   where Box2.ID_Worker = Worker.ID and 
         Item2.ID_Box = Box2.ID and
         Item2.ID_BoxColor = BoxColor2.ID) and
         BoxColor.ID = 0 ) as Red,
 (select count(*) from BoxColor as BoxColor2, Box as Box2, Item as Item2 
   where Box2.ID_Worker = Worker.ID and 
         Item2.ID_Box = Box2.ID and
         Item2.ID_BoxColor = BoxColor2.ID) and
         BoxColor.ID = 1 ) as Green,
 (select count(*) from BoxColor as BoxColor2, Box as Box2, Item as Item2 
   where Box2.ID_Worker = Worker.ID and 
         Item2.ID_Box = Box2.ID and
         Item2.ID_BoxColor = BoxColor2.ID) and
         BoxColor.ID = 2 ) as Blue,
from Worker, BoxSize, Box, Item
where 
    Item.ID_Worker = Worker.ID and
    Item.ID_Box = Box.ID
    Item.ID_BoxSize = BoxSize.ID
group by Worker.Name, BoxSize.Name
having Red > 0, Blue > 0, Green > 0
order by 1, 2
4

1 に答える 1

3

多分このようなもの:

SELECT
    Worker.Name,
    BoxSize.Name,
    SUM(CASE WHEN BoxColor.id=0 THEN 1 ELSE 0 END) AS BoxColor_0,
    SUM(CASE WHEN BoxColor.id=1 THEN 1 ELSE 0 END) AS BoxColor_1,
    SUM(CASE WHEN BoxColor.id=2 THEN 1 ELSE 0 END) AS BoxColor_2    
FROM
    Worker
    JOIN Box
        ON Worker.ID=Box.ID_Worker
    JOIN Item
        ON Item.ID_box=Box.ID
    JOIN BoxColor
        ON BoxColor.ID=Item.ID_BoxColor
    JOIN BoxSize
        ON BoxSize.ID=Item.ID_BoxSize
GROUP BY
    Worker.Name,
    BoxSize.Name
于 2013-10-09T07:57:25.793 に答える