有人可以幫我把這個查詢放在一起嗎?
我有這張桌子:
store name status orders
billys store new 15
billys store ordered 20
billys store canceled 2
johnny store new 5
johnny store out_of_stock 20
rosie store new 6
rosie store ordered 4
rosie store out_of_stock 10
如您所見,有些商店有一些其他商店沒有的狀態。
我想要的結果如下:
store name new ordered canceled out of stock
billys store 15 20 2 0
johnny store 5 0 0 20
rosie store 6 4 0 10
我嘗試了以下方法:
SELECT * FROM crosstab(
'SELECT store_name::text as store_name,
status::text as status,
count(*)::int as orders
FROM organizations
INNER JOIN orders ON organization_id = organizations.id
GROUP BY store_name, status
ORDER BY store_name, status'
) x (store_name text, "new" int, "ordered" int)
但這不起作用,因為當新行不是預期值時它會中斷。例如,對于“johnny store”,在“new”不是“ordered”之后,它是“out_of_stock”,所以這不起作用。
我瀏覽了一堆 StackOverflow 帖子,但我總體上很困惑。謝謝
uj5u.com熱心網友回復:
我們可以使用 CASE 來避免使用子查詢。
CREATE TABLE organisation ( store_name VARCHAR(25), status VARCHAR(25), orders INT); INSERT INTO organisation VALUES ('billys store', 'new' , 15), ('billys store', 'ordered' , 20), ('billys store', 'canceled' , 2), ('johnny store', 'new' , 5), ('johnny store', 'out_of_stock', 20), ('rosie store' , 'new' , 6), ('rosie store' , 'ordered' , 4), ('rosie store' , 'out_of_stock', 10);
受影響的 8 行
SELECT store_name, SUM(CASE WHEN status='new' THEN orders ELSE 0 END) new_, SUM(CASE WHEN status='canceled' THEN orders ELSE 0 END) canceled, SUM(CASE WHEN status='ordered' THEN orders ELSE 0 END) ordered, SUM(CASE WHEN status='new' THEN orders ELSE 0 END) o_o_s FROM organisation o GROUP BY store_name; GO商店名稱 | 新 | 取消| 訂購 | o_o_s :----------- | --: | --------: | ------: | ----: 比利商店| 15 | 2 | 20 | 15 約翰尼商店 | 5 | 0 | 0 | 5 羅西商店| 6 | 0 | 4 | 6
db<>在這里擺弄
uj5u.com熱心網友回復:
也許您無法從我提供的鏈接中理解它,但 tablefunc 擴展使這更容易恕我直言。這是基于您的代碼的示例,您可以將第一個查詢替換為從表中獲取資料的查詢:
create temporary table myTable (storename text, status text, orders int);
insert into myTable (storename, status, orders)
values
('billys store','new', 15),
('billys store','ordered', 20),
('billys store','canceled', 2),
('johnny store','new', 5),
('johnny store','out_of_stock', 20),
('rosie store','new', 6),
('rosie store','ordered', 4),
('rosie store','out_of_stock', 10);
SELECT * FROM crosstab(
'SELECT storename,
status,
orders
FROM myTable',
'select * from unnest(string_to_array(''new,ordered,canceled,out_of_stock'', '',''))'
) x (storename text, "new" int, "ordered" int, "canceled" int, "out_of_stock" int);
drop table myTable;
這是DBFiddle 演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/432598.html
標籤:PostgreSQL 交叉表
上一篇:全外連接沒有給出我需要的答案
