2012-01-25 14 views
1

私の質問は、次のクエリへのより速い方法はありますか?私は、Oracle 10gの別の値でSQL - グループ

を使用してい

は、私は、テーブルメーカーと自動車を持っていると言う、と私は列「Car.Name」のすべての出現をカウントします。ここで私はそれを行うだろうとどのようにある:結果を募集

SELECT manuf.Name, COUNT(car1.Name), COUNT(car2.Name), COUNT(car3.Name) 
FROM Manufacturer manuf 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari1') car1 ON manuf.PK = car1.ManufPK 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari2') car2 ON manuf.PK = car2.ManufPK 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari3') car3 ON manuf.PK = car3.ManufPK 
GROUP BY manuf.Name 

Manufacturer | Ferrari1 | Ferrari2 | Ferrari3 
---------------------------------------------- 
Fiat   | 1  | 0  | 5 
Ford   | 2  | 3  | 0 

私はJOINをLEFT数でこれを試みたが、それがうまく働きました。しかし、私が(90 +のように)たくさん追加したとき、それは非常に遅い(1分以上)でした。

私の質問は、このクエリを実行するより速い方法はありますか?あなたの質問は非常に明確ではありません。

SELECT manuf.Name, c.Name, COUNT(*) Cnt 
FROM Manufacturer manuf 
LEFT JOIN Car c ON manuf.PK = c.ManufPK 
GROUP BY manuf.Name, c.Name 

PS、ニーズに応じて、

+0

は、あなたの前のクエリは何だった私たちを見ることができますか? – everton

+0

@WoF_AngelどのRDBMSを使用しますか? MySQLでは、 'PIVOT'についてのMSSQLの 'GROUP_CONCAT'の使用について考えることができます –

+1

[適切なインデックスで複数の結合が少なくともPIVOT/GROUP BYだけでなくパフォーマンスも向上します](http://stackoverflow.com/questions/ 7448213/sql-server-pivot-vs-multiple-join/7449213#7449213) –

答えて

3

を絞り込むためにいくつかの望んでいた結果セットを提供します

select m.Name manufacturer_name, 
     c.Name car_name, 
     count(*) 
from Manufacturer m 
left join Car c 
     on m.PK = c.ManufPK and c.Name in ('Ferrari1','Ferrari2','Ferrari3') 
group by m.Name, c.Name 

ページ全体で個々の車を見るために必要がある場合は、試してみてください。

select m.Name manufacturer_name, 
     sum(case c.Name when 'Ferrari1' then 1 else 0 end) Ferrari1_Count, 
     sum(case c.Name when 'Ferrari2' then 1 else 0 end) Ferrari2_Count, 
     sum(case c.Name when 'Ferrari3' then 1 else 0 end) Ferrari3_Count 
from Manufacturer m 
left join Car c 
     on m.PK = c.ManufPK and c.Name in ('Ferrari1','Ferrari2','Ferrari3') 
group by m.Name 
+0

彼はそれに言及した。 – everton

+2

@aFだから何?これはニーズに合っていないので、洗練された質問が必要です –

+0

私はあなたの第2の提案を使いました。ありがとう。 –

0
SELECT manuf.Name, COUNT(DISTINCT c.Name) 
FROM Manufacturer manuf 
LEFT JOIN Car c ON manuf.PK = c.ManufPK 
GROUP BY manuf.Name 

OR。あなたは車がページをカウントダウン見て満足している場合は、してみてください答え

+0

これは、同じ行にすべてのカウントを与えるわけではありません。 –

+0

@ MarkBannisterコメントを見る –

0

また、これを試すことができます。

SELECT manuf.Name 
    , car1.cnt AS Ferrari1 
    , car2.cnt AS Ferrari2 
    , car3.cnt AS Ferrari3 
FROM 
     Manufacturer AS manuf 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari1' 
     GROUP BY ManufPK 
    ) AS car1 
    ON car1.ManufPK = manuf.PK 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari2' 
     GROUP BY ManufPK 
    ) AS car2 
    ON car2.ManufPK = manuf.PK 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari3' 
     GROUP BY ManufPK 
    ) AS car3 
    ON car3.ManufPK = manuf.PK 
ORDER BY manuf.Name