2016-12-05 2 views
4

데이터, 네트워크 및 소프트웨어라는 세 개의 테이블이 있습니다. 네트워크 및 소프트웨어 테이블에 서비스 티켓이있는 동안 데이터 테이블에는 모든 고객의 이름이 있습니다. 두 표 (네트워크 또는 소프트웨어) 중 하나에서 매월 클라이언트 당 최소 한 개의 티켓이 필요합니다. 매월 데이터 테이블의 각 클라이언트에 대해 두 테이블 (네트워크 및 소프트웨어)의 티켓을 계산하는 쿼리가 필요합니다.두 테이블의 행을 세 번째 테이블에 연결합니다.

my tables

욕망 결과 : Final query

나는이 쿼리와 함께 계산하는 방법을 발견하지만 난 두 테이블에서 계산하는 방법을 모르겠어요.

SELECT institucion 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-07%')as July 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-08%')as August 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-09%')as September 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-10%')as October 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-11%')as November 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2016-12%')as December 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-01%')as January 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-02%')as February 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-03%')as March 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-04%')as April 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-05%')as May 
    ,(SELECT count(institucion) FROM network WHERE data.institucion = network.institucion and fecha like '2017-06%')as June 
FROM data 
where data.erate = 'y' 
order by institucion 

답변

1

난 당신이 함께 UNIONnetworksoftware 테이블에 필요가 있다고 생각하고 관심 개월마다 카운트 요약을 얻기 위해 조건 집합을 사용합니다. 나는 또한 예를 들어 피벗

을 시도 할 수 있습니다, 팀에 agreen

SELECT t1.institucion, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-07%' THEN 1 ELSE 0 END) AS July, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-08%' THEN 1 ELSE 0 END) AS August, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-09%' THEN 1 ELSE 0 END) AS September, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-10%' THEN 1 ELSE 0 END) AS October, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-11%' THEN 1 ELSE 0 END) AS November, 
     SUM(CASE WHEN t1.fetcha LIKE '2016-12%' THEN 1 ELSE 0 END) AS December, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-01%' THEN 1 ELSE 0 END) AS January, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-02%' THEN 1 ELSE 0 END) AS February, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-03%' THEN 1 ELSE 0 END) AS March, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-04%' THEN 1 ELSE 0 END) AS April, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-05%' THEN 1 ELSE 0 END) AS May, 
     SUM(CASE WHEN t1.fetcha LIKE '2017-06%' THEN 1 ELSE 0 END) AS June 
FROM 
(
    SELECT institucion, fecha, service 
    FROM network n 
    UNION ALL 
    SELECT institucion, fecha, service 
    FROM software s 
) t1 
INNER JOIN data t2 
    ON t1.institucion = t2.institucion 
WHERE t2.erate = 'y' 
0

는 :

 SELECT * FROM (
      SELECT institucion 
       ,LEFT(fecha,7) AS [month],COUNT(institucion) AS cnt 
      FROM DATA AS d 
      LEFT JOIN network AS n ON d.institucion=n.institucion 
      where data.erate = 'y' 
      GROUP BY institucion,LEFT(fecha,7) 
    ) AS t 
    PIVOT(MAX(cnt) FOR [month] IN ([2016-07],[2016-08],[2016-09],[2016-10],[2016-11],[2016-12],[2017-01],[2017-02],[2017-03],[2017-04],[2017-05],[2017-06])) p 
0

당신은 소프트웨어 및 네트워크 테이블의 계산 된 결과 세트에 동적 피벗를 적용해야합니다.

CREATE TABLE #DATA (INSTITUTION VARCHAR(20)) 

INSERT INTO #DATA 
SELECT 'CLIENT1' 
UNION ALL 
SELECT 'CLIENT2' 
UNION ALL 
SELECT 'CLIENT3' 
UNION ALL 
SELECT 'CLIENT4' 


CREATE TABLE #NETWORK (INSTITUTION VARCHAR(20), FECHA DATE, SERVICE VARCHAR(50)) 

INSERT INTO #NETWORK 

SELECT 'CLIENT2', '2016-11-20', 'internet confirmation' 
UNION ALL 
SELECT 'CLIENT3', '2016-11-07', 'internet confirmation' 
UNION ALL 
SELECT 'CLIENT1', '2016-12-02', 'internet confirmation' 
UNION ALL 
SELECT 'CLIENT2', '2016-10-31', 'internet confirmation' 
UNION ALL 
SELECT 'CLIENT3', '2016-10-20', 'internet confirmation' 


CREATE TABLE #SOFTWARE (INSTITUTION VARCHAR(20), FECHA DATE, SERVICE VARCHAR(20)) 

INSERT INTO #SOFTWARE 

SELECT 'CLIENT4', '2016-12-04', 'installation' 
UNION ALL 
SELECT 'CLIENT2', '2016-11-25', 'configuration' 
UNION ALL 
SELECT 'CLIENT1', '2016-11-02', 'installation' 
UNION ALL 
SELECT 'CLIENT3', '2016-10-31', 'installation' 
UNION ALL 
SELECT 'CLIENT3', '2016-10-20', 'configuration' 

지금 데이터 및 저장소 (INSERT) 동적 쿼리를 구축하기위한 임시 테이블 (#PIVOTING)에 조회하여 이미지의 빌드 스키마를 할 수 있습니다.

SELECT D.INSTITUTION, COMB.MONTH_NAME, COUNT(1) AS TICKET_COUNT 
INTO #PIVOTING --Taking Data in Temp table 
FROM #DATA D 
INNER JOIN (
SELECT INSTITUTION, FECHA, [SERVICE], DATENAME(YY,FECHA)+'-'+ DATENAME(MM, FECHA) MONTH_NAME 
    FROM #NETWORK 

    UNION ALL 

SELECT INSTITUTION, FECHA, [SERVICE],DATENAME(YY,FECHA)+'-'+ DATENAME(MM, FECHA) MONTH_NAME 
    FROM #SOFTWARE 
) AS COMB ON D.INSTITUTION = COMB.INSTITUTION 
GROUP BY D.INSTITUTION, COMB.MONTH_NAME 

이제 피벗에 대한 변수에 열 이름을 선택하고 피벗의 동적 쿼리에서 사용할

DECLARE @COLUMNS VARCHAR(MAX) =(
     SELECT STUFF((
        SELECT DISTINCT ',[' + MONTH_NAME + ']' 
        FROM #PIVOTING 
        FOR XML PATH('') 
        ), 1, 1, '') 
     ) 

DECLARE @QRY VARCHAR(MAX) =' 
     SELECT * FROM #PIVOTING AS DATA 
     PIVOT (MAX(TICKET_COUNT) FOR MONTH_NAME IN (' + @COLUMNS +') 

      ) PVT 


' 

EXEC(@QRY) 
관련 문제