2016-12-05 70 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在一起networksoftware表,然后使用条件聚合得到计数汇总每个感兴趣的几个月。

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) 
相关问题