2016-12-05 7 views
4

Ich habe drei Tabellen: Daten, Netzwerk und Software. Die Datentabelle hat alle Namen meines Clients, während die Netzwerk- und Softwaretabellen Servicetickets haben. Wir benötigen mindestens ein Ticket pro Kunde pro Monat von einer der beiden Tabellen (Netzwerk oder Software). Ich brauche eine Abfrage, um die Tickets aus beiden Tabellen (Netzwerk und Software) für jeden Client in der Datentabelle für jeden Monat zu zählen.Zählen Sie Zeilen von zwei Tabellen zu einer dritten Tabelle

my tables

Wunsch Ergebnis: Final query

fand ich die Art und Weise mit dieser Abfrage zu zählen, aber ich weiß nicht, wie aus beiden Tabellen zu zählen.

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 

Antwort

1

Ich glaube, Sie müssen UNION zusammen die network und software Tabellen und verwenden Sie dann bedingte Aggregation Anzahl Zusammenfassungen für jeden der Monate von Interesse zu erhalten.

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

ich mit Tim agreen, Sie können auch Pivot

Zum Beispiel versuchen:

 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

Sie benötigen Dynamische Pivot auf berechnete Ergebnismenge von Software- und Netzwerk-Tabellen anzuwenden.

Lets Build Schema Ihrer Bilder

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' 

Nun ist die Abfrage von Daten und Store (INSERT) in einer Temp-Tabelle (#PIVOTING) für die dynamische Abfrage zu erstellen.

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 

Jetzt Spaltennamen in eine Variable für Pivot auswählen und sie in dynamischer Abfrage von Dreh verwenden

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) 
Verwandte Themen