1

TableB를 통해 TableC와 다 대 다 관계로 TableA를 가졌습니다. 즉 SQL 집계 쿼리, 접합 테이블의 항목을 기준으로 그룹화

TableA  TableB   TableC 
id | val  fkeyA | fkeyC id | data 

나는 TableC의 관계 (들)에 의해 그룹화, TableA의에 할 일 select sum(val)을 기원한다. TableA의 모든 항목에는 TableC와 적어도 하나의 관계가 있습니다. 예를 들어,

TableA 
1 | 25 
2 | 30 
3 | 50 

TableB 
1 | 1 
1 | 2 
2 | 1 
2 | 2 
2 | 3 
3 | 1 
3 | 2 

정상적으로 테이블의 행 1 및 3 보낸 출력

75 
30 

는 TableC 동일한 관계를 갖고 있지만 TableA의의 행 2 TableC에 다른 관계를 갖는다.

이 경우 어떻게 SQL 쿼리를 작성할 수 있습니까?

+0

따라서 행 4가 값 A와 함께 테이블 A에 입력되고 레코드 1과 2를 통해 C와 관련이있는 경우 75는 105가됩니까? 5 번째 레코드가 30이라는 값으로 입력되고 레코드 6과 7을 통해 c와 관련이 있다면 결과에 75,30,30이 표시됩니까? – xQbert

+0

@xQert : 예 및 예 – cm007

답변

1
SELECT  
    sum(tableA.val) as sumVal,  
    tableC.data 
FROM  
    tableA 
    inner join tableB ON tableA.id = tableB.fkeyA 
    INNER JOIN tableC ON tableB.fkeyC = tableC.id 
GROUP by tableC.data 

편집 아 하는 - 지금 당신이에 얻고 무엇을 참조하십시오. 나를 다시 해보자 :

SELECT 
    sum(val) as sumVal, 
    tableCGroup 
FROM 
(

SELECT 
    tableA.val, 
    (
     SELECT cast(tableB.fkeyC as varchar) + ',' 
     FROM tableB WHERE tableB.fKeyA = tableA.id 
     ORDER BY tableB.fkeyC 
     FOR XML PATH('') 
    ) as tableCGroup 
FROM 
    tableA 


) tmp 
GROUP BY 
    tableCGroup 
+0

이 쿼리는 예제에서 TableA의 row2를 포함하여 105를 제공합니다. – cm007

+0

TableC의 내용을 보는 것이 도움이되며 "TableA의 2 행"은 TableC와는 다른 관계입니다 " –

+0

그 요청 무시 - –

0
SELECT sum(a.val) 
FROM tablea a 
INNER JOIN tableb b ON (b.fKeyA = a.id) 
GROUP BY b.fKeyC 
+0

전에 전체 문제를 보지 못했습니다.이 쿼리는 예제에서 TableA의 행 2를 포함하며 105를 제공합니다. – cm007

1

흠, MySQL의에서이 같이 작성할 수 있습니다 :

SELECT 
    SUM(val) AS sumVal 
FROM 
    (SELECT 
      fkeyA 
     , GROUP_CONCAT(fkeyC ORDER BY fkeyC) AS grpC 
     FROM 
      TableB 
     GROUP BY 
      fkeyA 
    ) AS g 
    JOIN 
    TableA a 
     ON a.id = g.fkeyA 
GROUP BY 
    grpC 
+0

+1, OP 의도를 올바르게 해독 한 것으로 보입니다. – Johan

+0

SQL Server에서 FOR XML PATH ('')를 사용하여 동일한 작업을 수행 할 수 있다고 생각합니다. 어떻게 작동하는지 보여주기 위해 내 대답을 업데이트했습니다. –

0

그것은 그게으로 그룹을 허용하는 orther에 KEY_LIST을 만드는 데 필요한 것 같다 :

75 -> key list = "1 2" 
30 -> key list = "1 2 3" 

GROUP_CONCAT이 아닌 T-SQL에 존재하는 않기 때문에 :

WITH CTE (Id, key_list) 
      AS (SELECT TableA.id, CAST('' AS VARCHAR(8000)) 
       FROM TableA 
       GROUP BY TableA.id 
       UNION ALL 
       SELECT TableA.id, CAST(key_list + ' ' + str(TableB.id) AS VARCHAR(8000)) 
       FROM CTE c 
       INNER JOIN TableA A 
        ON c.Id = A.id 
       INNER join TableB B 
        ON B.Id = A.id 
       WHERE A.id > c.id  --avoid infinite loop 
      ) 
Select 
    sum(val) 
from 
    TableA inner join 
    CTE on (tableA.id = CTE.id) 
group by 
    CTE.key_list 
+0

이것은 무한 재귀를 제공하는 것으로 보이며이를 유한하게 만드는 방법을 알 수 없습니다. – cm007

+2

지금 쏴, 007. – danihp