あなたの ROLLUP はすでに正しいです。実際にCOUNT(CASE WHEN Field = 'Blah' THEN 1 ELSE 0 END)
は、クエリが機能しない主な原因です
次のいずれかを行う必要があります。
COUNT(CASE WHEN Field = 'Blah' THEN 1 END)
また
SUM(CASE WHEN Field = 'Blah' THEN 1 ELSE 0 END)
しかし、MySQL は C 言語のようにブール型と整数型の間に二重性があるため、次のようにすることもできます。
SUM(Field = 'Blah')
これは間違ったクエリです (間違った結果): http://www.sqlfiddle.com/#!2/70187/1
create table ProductInventory(
ProductCode varchar(10) not null,
Location varchar(50) not null
);
insert into ProductInventory(ProductCode,Location) values('CPU','US');
insert into ProductInventory(ProductCode,Location) values('CPU','US');
insert into ProductInventory(ProductCode,Location) values('CPU','CN');
insert into ProductInventory(ProductCode,Location) values('KB','CN');
insert into ProductInventory(ProductCode,Location) values('KB','JP');
insert into ProductInventory(ProductCode,Location) values('KB','US');
insert into ProductInventory(ProductCode,Location) values('MOUSE','US');
insert into ProductInventory(ProductCode,Location) values('MOUSE','CN');
間違った出力:
PRODUCTCODE USQTY CHINAQTY
CPU 3 3
KB 3 3
MOUSE 2 2
8 8
これは正しいクエリです: http://www.sqlfiddle.com/#!2/70187/2
select ProductCode,
COUNT(CASE WHEN Location = 'US' THEN 1 END) as UsQty,
COUNT(CASE WHEN Location = 'CN' THEN 1 END) as ChinaQty
from ProductInventory
group by ProductCode with rollup
正しい出力:
PRODUCTCODE USQTY CHINAQTY
CPU 2 1
KB 1 1
MOUSE 1 1
4 3
これが正しいと主張しないでください。これは非常に間違っています。
COUNT(CASE WHEN Location = 'US' THEN 1 ELSE 0 END) AS UsQty
これを行う必要があります(正しい):
COUNT(CASE WHEN Location = 'US' THEN 1 END) AS UsQty
またはこれ(正しい):http://www.sqlfiddle.com/#!2/70187/5
SUM(CASE WHEN Location = 'US' THEN 1 ELSE 0 END) AS UsQty
またはこれ(正しい):http://www.sqlfiddle.com/#!2/70187/6
SUM(CASE WHEN Location = 'US' THEN 1 END) AS UsQty
または、MySql にはブール値と整数の間に二重性があるという事実を利用してみてください (正しい): http://www.sqlfiddle.com/#!2/70187/4
SUM(Location = 'US') AS UsQty
ボトムライン
これを使用しないでください (間違っています): http://www.sqlfiddle.com/#!2/70187/3
COUNT(Location = 'US') as UsQty
また、これも使用しないでください (クエリと同様に間違っています): http://www.sqlfiddle.com/#!2/70187/1
COUNT(CASE WHEN Location = 'US' THEN 1 ELSE 0 END) as UsQty
ちなみに、これも機能します。理由はあなた次第です ;-)
COUNT(CASE WHEN Location = 'US' THEN 1976 END) AS UsQty
アップデート
これがあなたが必要としているものだと私は感じています:
create table Product
(
ProductCode varchar(10) not null primary key,
ProductName varchar(100) not null
);
insert into Product(ProductCode,ProductName) values
('CPU','Central Processing Unit'),
('KB','Keyboard'),
('MSE','Mouse'),
('RAM', 'Random Access Memory');
create table ProductInventory(
ProductCode varchar(10) not null,
Location varchar(50) not null
);
insert into ProductInventory(ProductCode,Location) values
('CPU','US'),
('CPU','PH'),
('CPU','PH'),
('KB','PH'),
('KB','US'),
('KB','US'),
('MSE','US'),
('MSE','JP');
select p.ProductCode,
coalesce(SUM(i.Location = 'US'),0) as UsQty,
coalesce(SUM(i.Location = 'PH'),0) as PhilippinesQty
from Product p
left join ProductInventory i on i.ProductCode = p.ProductCode
group by p.ProductCode with rollup
出力:
ProductCode UsQty PhilippinesQty
CPU 1 2
KB 2 1
MSE 1 0
RAM 0 0
4 4
ライブ テスト: http://www.sqlfiddle.com/#!2/2bb09/1