2016-12-05 10 views
4

データ、ネットワーク、ソフトウェアの3つのテーブルがあります。ネットワークテーブルとソフトウェアテーブルにサービスチケットがある間、データテーブルはすべて自分のクライアントの名前を持ちます。両方のテーブル(ネットワークまたはソフトウェア)から月に1クライアントあたり最低1枚のチケットが必要です。私は毎月のデータテーブル内の各クライアントの両方のテーブル(ネットワークとソフトウェア)からのチケットをカウントするためのクエリが必要です。2つのテーブルの行を第3のテーブルに関連付ける

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

あなたは、ソフトウェアとネットワークテーブルの計算された結果セットにダイナミックピボットを適用する必要があります。

、動的クエリを構築するための今すぐ一時テーブル内のデータとストア(INSERT)(#PIVOTING)を照会し、あなたのイメージのスキーマ

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' 

を構築することができます。

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) 
関連する問題