2

次のように、データベースからシステムと領域を返すクエリがあります。

SELECT  Areas.ID AreaID,
    Areas.Name AreaName,
              Systems.*

FROM Systems
INNER JOIN Areas ON Areas.ID = Systems.AreaID
WHERE ....

これは、次のようなデータを返します。

|  AreaID   |  AreaName   | SystemName  | ...
|     1     |    area1    |     sys1    |
|     1     |    area1    |     sys2    |
|     1     |    area1    |     sys3    |
|     1     |    area1    |     sys4    |
|     2     |    area2    |     sys5    |
|     2     |    area2    |     sys6    |

返された各領域のシステムの数を含む追加の列を返したいので、次のようになります。

|  AreaID   |  AreaName   | SystemName  |  noOfSystems  | ...
|     1     |    area1    |     sys1    |       4       |
|     1     |    area1    |     sys2    |       4       |
|     1     |    area1    |     sys3    |       4       |
|     1     |    area1    |     sys4    |       4       |
|     2     |    area2    |     sys5    |       2       |
|     2     |    area2    |     sys6    |       2       |

IEエリアIDが1のシステムとエリアIDが2のシステムが4つあります。

これはどのように行うことができますか?これを行う組み込み関数について聞いたことがあると思いますが、必要なものが見つかりません。

4

3 に答える 3

4

集計関数を使用してから、を使用する必要がありCOUNT()ますGROUP BY。これは、相関サブクエリで実行できます。

SELECT  Areas.AreaID AreaID,
    Areas.areaname AreaName,
    s1.SystemName,
    (select count(systemname) 
     from systems s2
     where s1.areaid = s2.areaid
     group by areaid) noOfSystems
FROM Systems s1
INNER JOIN Areas 
    ON Areas.AreaID = s1.AreaID
WHERE ....

SQL FiddlewithDemoを参照してください

または、参加するサブクエリを使用して、合計数を取得できます。

SELECT  Areas.ID AreaID,
    Areas.Name AreaName,
    s1.SystemName,
    s2.NoOfSystems
FROM Systems s1
INNER JOIN Areas 
    ON Areas.ID = s1.AreaID
INNER JOIN
(
    select COUNT(SystemName) NoOfSystems,
        AreaID
    from systems
    group by AreaID
) s2
    on s1.AreaID= s2.AreaID
WHERE ....

SQL FiddlewithDemoを参照してください

このバージョンでは、サブクエリを使用して合計数を取得し、それをSystemsテーブルに結合して、必要に応じて追加の列を返します。

または、RDBMSに次のオプションを使用してこのオプションがある場合は、ウィンドウ関数を使用できますCount() over()

SELECT  Areas.ID AreaID,
    Areas.Name AreaName,
    Systems.SystemName,
    COUNT(SystemName) over(partition by Areas.ID, Areas.AreaName) as NoOfSystems
FROM Systems
INNER JOIN Areas 
    ON Areas.ID = Systems.AreaID
WHERE ....

SQL FiddlewithDemoを参照してください

于 2013-02-04T15:20:01.797 に答える
1

次のような相関サブクエリを使用します。

SELECT 
  a.ID AreaID,
  a.Name AreaName,
  s1.*,
  (SELECT COUNT(s2.SystemName)
   FROM Systems s2 
   WHERE a.id = s2.AreasID) AS noofSystem
FROM Systems s1
INNER JOIN Areas a ON a.ID = S1.AreaID
WHERE ....

または:

SELECT  
    Areas.ID AreaID,
    Areas.Name AreaName,
    Systems.SystemName,
    COUNT(Systems.SystemName) AS noOfSystems  
FROM Systems
INNER JOIN Areas ON Areas.ID = Systems.AreaID
WHERE ...
GROUP BY 
    Areas.ID AreaID,
    Areas.Name AreaName,
    Systems.SystemName;
于 2013-02-04T15:19:21.750 に答える
0

これにより、現在の行と同じAreaIDとAreaNameを持つ結果の行数がわかります。AreaNameが一意であるかどうかわからないため、その数を取得する際にそれを含めます。

;WITH cte AS (
    -- Original query
    SELECT Areas.ID AreaID,
        Areas.Name AreaName,
        Systems.SystemName
    FROM Systems
        INNER JOIN Areas ON Areas.ID = Systems.AreaID
    --WHERE...
)
SELECT AreaID,
    AreaName,
    SystemName
    -- Here's where we get the count of rows returned for each unique area
    (SELECT COUNT(*) FROM cte WHERE AreaID = c.AreaID AND AreaName = c.AreaName) AS noOfSystems
FROM cte c

この方法で共通テーブル式を使用すると、元のクエリを変更せずに使用できるようになります。

于 2013-02-04T15:23:42.807 に答える