如何求和2个不同的SQL查询的值?
问题描述:
我有点新使用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
这里是第二个查询:
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
什么我将需要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
答
我没有要测试的数据,但这应该让你开始。
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
答
创建2个CTE,如https://msdn.microsoft.com/en-us/library/ms175972.aspx#C-Using-multiple-CTE-definitions-in-a-single-query中所述,然后将它们连接在一起并在您的中执行所需的计算SELECT最后子句
答
或者你可以使用
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串在一起的方法。
hi maderson,我试过这段代码。虽然它的工作。当某个位置的qc中没有数据时,让我们说kuala lumpur,它不会显示在表中 – kaede
然后您必须使用#TABLE1到#TABLE2连接。所有的地点都会在#TABLE2吗?如果是这样,请从中选择,然后加入#TABLE1。如果两个表可以有不同的位置,那么你将不得不使用另一个连接。 http://sqlmag.com/t-sql/t-sql-join-types – manderson