
資料庫是Oracle,謝謝大神回答
uj5u.com熱心網友回復:
selectcase when a.停車場='a' then a.車類 end as 車類,
case when a.停車場='a' then a.進場總數 end as 進場總數,
case when b.停車場='a' then b.放車數 end as 放車數,
case when c.停車場='a' then c.報廢數 end as 報廢數,
......
from
(select 車類,停車場,count(*) as 進場總數 from 進場表 group by 車類,停車場) a,
(select 車類,停車場,sum(是否放車) as 放車數 from 進場表 group by 車類,停車場) b,
(select 車類,停車場,sum(是否報廢) as 報廢數 from 進場表 group by 車類,停車場) c
where a.車類 = b.車類 and a.車類 = c.車類 and a.停車場 = b.停車場 and a.停車場 = c.停車場
存量無法計算,需要給出統計口徑
uj5u.com熱心網友回復:
selectcase when a.停車場='a' then a.車類 end as 車類,
case when a.停車場='a' then a.進場總數 end as 進場總數,
case when b.停車場='a' then b.放車數 end as 放車數,
case when c.停車場='a' then c.報廢數 end as 報廢數,
......
from
(select 車類,停車場,count(*) as 進場總數 from 進場表 group by 車類,停車場 order by 車類) a,
(select 車類,停車場,sum(是否放車) as 放車數 from 進場表 group by 車類,停車場 order by 車類) b,
(select 車類,停車場,sum(是否報廢) as 報廢數 from 進場表 group by 車類,停車場 order by 車類) c
where a.車類 = b.車類 and a.車類 = c.車類
存量無法計算,需要給出統計口徑
uj5u.com熱心網友回復:
with tab1 as (
select 1 "車類", 'a' typ, 1 c1, 2 c2, 3 c3, 4 c4 from dual union all
select 3 "車類", 'a' typ, 12 c1, 23 c2, 34 c3, 45 c4 from dual union all
select 3 id, 'b' typ, 11 c1, 2 c2, 3 c3, 4 c4 from dual
)
select*from tab1 t1
pivot(max(c1) c1, max(c2) c2, max(c3) c3, max(c4) c4 for typ in ('a' typ_a, 'b' typ_b))
;
也可以用傳統的縱轉橫寫法,但是樓上的有點傳統過頭了。。。
uj5u.com熱心網友回復:
我這么寫基本所有資料庫都能通用uj5u.com熱心網友回復:
SELECT T.車輛型別,停車場A進場總數,
停車場A放車數,
停車場A報廢數,
停車場A存量,
停車場B進場總數,
停車場B放車數,
停車場B報廢數,
停車場B存量
FROM (
SELECT T.車輛型別,
SUM(CASE WHEN T.停車場 = 'a' THEN 1 ELSE 0 END) 停車場A進場總數,
SUM(CASE WHEN T.停車場 = 'a' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場A放車數,
SUM(CASE WHEN T.停車場 = 'a' AND T.是否報廢 = 1 THEN 1 ELSE 0 END) 停車場A報廢數,
SUM(CASE WHEN T.停車場 = 'a' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停車場 = 'a' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場A存量,
SUM(CASE WHEN T.停車場 = 'b' THEN 1 ELSE 0 END) 停車場B進場總數,
SUM(CASE WHEN T.停車場 = 'b' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場B放車數,
SUM(CASE WHEN T.停車場 = 'b' AND T.是否報廢 = 1 THEN 1 ELSE 0 END) 停車場B報廢數,
SUM(CASE WHEN T.停車場 = 'b' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停車場 = 'b' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場B存量,
1 TY
FROM 進場表 T GROUP BY T.車輛型別
UNION ALL
SELECT '合計' 車輛型別,
SUM(CASE WHEN T.停車場 = 'a' THEN 1 ELSE 0 END) 停車場A進場總數,
SUM(CASE WHEN T.停車場 = 'a' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場A放車數,
SUM(CASE WHEN T.停車場 = 'a' AND T.是否報廢 = 1 THEN 1 ELSE 0 END) 停車場A報廢數,
SUM(CASE WHEN T.停車場 = 'a' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停車場 = 'a' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場A存量,
SUM(CASE WHEN T.停車場 = 'b' THEN 1 ELSE 0 END) 停車場B進場總數,
SUM(CASE WHEN T.停車場 = 'b' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場B放車數,
SUM(CASE WHEN T.停車場 = 'b' AND T.是否報廢 = 1 THEN 1 ELSE 0 END) 停車場B報廢數,
SUM(CASE WHEN T.停車場 = 'b' THEN 1 ELSE 0 END) - SUM(CASE WHEN T.停車場 = 'b' AND T.是否放車 = 1 THEN 1 ELSE 0 END) 停車場B存量,
2 TY
FROM 進場表 T GROUP BY T.車輛型別 ) T ORDER BY T.TY,T.車輛型別 ;
uj5u.com熱心網友回復:
我這么寫通用性和你一樣,但是只需要查一次表。得出結果只是第一步,關鍵是效率啊。
with tab1 as (
select 1 id, 'a' typ, 1 c1, 2 c2, 3 c3, 4 c4 from dual union all
select 3 "車類", 'a' typ, 12 c1, 23 c2, 34 c3, 45 c4 from dual union all
select 3 id, 'b' typ, 11 c1, 2 c2, 3 c3, 4 c4 from dual
)
select t1.id,
sum(case when t1.typ = 'a' then t1.c1 else 0 end) a,
sum(case when t1.typ = 'a' then t1.c2 else 0 end)a,
sum(case when t1.typ = 'a' then t1.c3 else 0 end)a,
sum(case when t1.typ = 'a' then t1.c4 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c1 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c2 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c3 else 0 end)a,
sum(case when t1.typ = 'b' then t1.c4 else 0 end)a
from tab1 t1
group by t1.id
;
uj5u.com熱心網友回復:
同意樓上的意見表資料量如果只有幾W可能感覺不出什么差異,可資料量一旦達到一定數量級,比如上百萬就會感覺到很明顯的差距了
高效的SQL幾秒鐘就能有結果,低效的甚至可能要等上幾十分鐘
uj5u.com熱心網友回復:
對于統計類的問題,最好減少表的關聯。特別是不要同一個表關聯多次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/44703.html
標籤:開發
上一篇:Oracle的 ora03114..ora24324
下一篇:表查詢僅顯示執行無記錄顯示
