2016-12-05 3 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

Я думаю, что вам нужно UNION вместе network и software таблиц, а затем использовать условную агрегацию, чтобы получить подсчет резюме для каждого из месяцев интереса.

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

Я agreen с Тимом, также вы можете попробовать Pivot

Например:

 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) в Temp таблице (#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 

Теперь выбрать имена столбцов в переменную для Pivot и использовать их в динамическом запросе шарниром

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) 
Смежные вопросы