2017-02-15 90 views
1

我有点新使用SQL。我有两个不同的查询,我需要添加或总结每个查询中列的值之一。提供示例代码和对结果的截图如下:如何求和2个不同的SQL查询的值?

WITH tbl AS 
( 
    SELECT 
     y.Location, 
     IIF(Status = 'Completed', 1,0) as Completed, 
     IIF(Status = 'Pending', 1, 0) as Pending, 
     IIF(Status = 'Scheduled', 1, 0) as Scheduled, 
     IIF(Satisfied = 'Satisfied', 1 , 0) As Satisfied, 
     IIF(Attrition IN ('Red', 'Amber'),1,0) As Attrition 
    FROM 
     order x 
    LEFT JOIN 
     roster y ON x.customerID = y.cID 
    LEFT JOIN 
     tbl_calendar z ON (x.starttime between z.datestart AND z.dateend) 
    WHERE 
     y.LOCATION IS NOT NULL 
     AND y.Location <> 'Ireland' 
     AND z.month ='2' 
     AND z.week IN (SELECT * FROM dbo.split('1,2,3',',')) 
     AND z.year = '2017' 
) 
SELECT 
    Location, 
    SUM(Completed) AS Completed, 
    SUM(Pending) AS Pending, 
    SUM(Scheduled) AS Scheduled, 
    SUM(Satisfied) as Satisfied, 
    SUM(Attrition) as Attrition 
FROM 
    tbl 
GROUP BY 
    Location 

enter image description here

这里是第二个查询:

SELECT 
    y.location, count (*) as qc 
FROM 
    customer_quality x 
LEFT JOIN 
    roster y ON x.customerEID = y.cEID 
LEFT JOIN 
    tbl_calendar z ON (x.DateTimeDelivered BETWEEN z.datestart AND z.dateend) 
WHERE 
    y.location IS NOT NULL 
    AND x.status = '4' 
    AND z.month = '2' 
    AND z.week IN (SELECT * FROM dbo.split('1,2,3',',')) 
    AND z.year = '2017' 
GROUP BY 
    y.Location 

enter image description here

什么我将需要do是将查询1中完成的全部订单的价值添加到我的查询2上的全部质量客户。

例如:

如果有208完整的客户在里斯本它会了其他4个优质客户,总应该是212

这将表明这样的:

Location Completed Pending  Scheduled Satisfied Attrition 
Kuala Lumpur 388  76   9   388   3 
Lisbon   212  92   29   207   1 
Manila   3535  97   167   662  24 
Mumbai   538  50   54   2100  6 
Warsaw   147  38   4   145   9 

回答

0

我没有要测试的数据,但这应该让你开始。

With tbl as 
( SELECT y.Location, 
      IIF(Status = 'Completed', 1,0) as Completed, 
      IIF(Status = 'Pending', 1, 0) as Pending, 
      IIF(Status = 'Scheduled', 1, 0) as Scheduled, 
      IIF(Satisfied = 'Satisfied', 1 , 0) As Satisfied, 
      IIF(Attrition IN ('Red', 'Amber'),1,0) As Attrition 
    FROM order x 
     LEFT JOIN roster y ON x.customerID=y.cID 
     LEFT JOIN tbl_calendar z ON (x.starttime between z.datestart AND z.dateend) 
    WHERE y.LOCATION IS NOT NULL 
      AND y.Location <> 'Ireland' 
      AND z.month ='2' 
      AND z.week IN (select * from dbo.split('1,2,3',',')) 
      AND z.year='2017' 
) 

SELECT Location, 
     SUM(Completed) AS Completed , 
     SUM (Pending) AS Pending, 
     SUM(Scheduled) AS Scheduled, 
     SUM(Satisfied) as Satisfied, 
     SUM(Attrition) as Attrition 
INTO #TABLE1 
FROM tbl 
GROUP BY Location 

SELECT y.location, count (*) as qc 
INTO #TABLE2 
FROM customer_quality x 
    LEFT JOIN roster y ON x.customerEID = y.cEID 
    LEFT JOIN tbl_calendar z ON (x.DateTimeDelivered between z.datestart 
AND z.dateend) 
WHERE y.location is not null 
     AND x.status='4' AND z.month = '2' 
     AND z.week IN (select * FROM dbo.split('1,2,3',',')) AND z.year='2017' 
GROUP by y.Location 



SELECT t1.Location 
     , (t1.Completed + t2.qc) AS Completed 
     , t1.Pending 
     , t1.Scheduled 
     , t1.Satisfied 
     , t1.Attrition 
FROM #TABLE1 t1 
    JOIN #TABLE2 t2 ON 
     t1.Location = t2.Location 



DROP TABLE #TABLE1 
DROP TABLE #TABLE2 
+0

hi maderson,我试过这段代码。虽然它的工作。当某个位置的qc中没有数据时,让我们说kuala lumpur,它不会显示在表中 – kaede

+0

然后您必须使用#TABLE1到#TABLE2连接。所有的地点都会在#TABLE2吗?如果是这样,请从中选择,然后加入#TABLE1。如果两个表可以有不同的位置,那么你将不得不使用另一个连接。 http://sqlmag.com/t-sql/t-sql-join-types – manderson

0

或者你可以使用

SELECT * INTO #temp1 FROM (
    SELECT Location, 
     SUM(Completed) AS Completed , 
     SUM (Pending) AS Pending, 
     SUM(Scheduled) AS Scheduled, 
     SUM(Satisfied) as Satisfied, 
     SUM(Attrition) as Attrition 
    FROM tbl 
    GROUP BY Location 
) 

SELECT * INTO #temp2 FROM (
    SELECT y.location, count (*) as qc 
    FROM customer_quality x 
     LEFT JOIN roster y ON x.customerEID = y.cEID 
     LEFT JOIN tbl_calendar z ON (x.DateTimeDelivered between z.datestart AND z.dateend) 
    WHERE y.location is not null 
      AND x.status='4' AND z.month = '2' 
      AND z.week IN (select * FROM dbo.split('1,2,3',',')) AND z.year='2017' 
    GROUP by y.Location 
) 
到底

存储您在临时表中第一个查询结果的汇总查询可以是:

SELECT t1.location 
, t1.COMPLETED + t2.cq AS Completed 
, t1.Pending 
, t1.Scheduled 
, t1.Satisfied 
, t1.Attrition 
FROM #temp1 t1 
JOIN #temp2 t2 on t1.location = t2.location 

还是带个a将CTE串在一起的方法。