用 where 连接两个 table
Join two table with where
我有两个来自两个视图的查询
查询 1:
SELECT sum(cancels) as cancelcount,codeprogram
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND
'2/20/2022' and usercode = 8066
GROUP By codeprogram
结果是:
cancelcount
codeprogram
7
3001
7
3002
2
3006
查询 2:
SELECT SUM(sellcount) sellcount,codeprogram,price
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram,price
结果是:
sellcount
codeprogram
price
27
3001
10000
25
3000
20000
9
3006
25000
3
3011
15000
8
3008
11000
55
3002
50000
如何加入两个视图,然后从销售数量中减去取消数量,最后将数量乘以价格,在指定的日期范围内?
在每个视图中,我都有字段 date_save(日期时间),它由 getdate() 和用户代码填充。
finalcount = (sellcount - cancelcount) * price
我希望最终输出如下:
finalcount
codeprogram
price
20
3001
200000
25
3000
500000
7
3006
175000
3
3011
45000
8
3008
88000
47
3002
2350000
谢谢
您可以尝试将两个子查询与 OUTER JOIN
一起使用的一种方法
SELECT sellcount - ISNULL(cancelcount,0) finalcount,
t1.codeprogram,
t1.price
FROM (
SELECT SUM(sellcount) sellcount,codeprogram,price
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram,price
) t1
LEFT JOIN (
SELECT sum(cancels) as cancelcount,codeprogram
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram
) t2 ON t1.codeprogram = t2.codeprogram
根据您的查询,您可以重写如下,使用 UNION ALL
结合 sells
& CanceliTems
并制作一个标志来表示 1 是
正数,2为负数则使用条件聚合函数。
SELECT SUM(CASE WHEN flag = 1 THEN sellcount ELSE - sellcount END),codeprogram,SUM(price) price
FROM (
SELECT sellcount,codeprogram,price , 1 flag
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
UNION ALL
SELECT cancels,codeprogram,0 , 2
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
) t1
GROUP BY codeprogram
我有两个来自两个视图的查询
查询 1:
SELECT sum(cancels) as cancelcount,codeprogram
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND
'2/20/2022' and usercode = 8066
GROUP By codeprogram
结果是:
cancelcount | codeprogram |
---|---|
7 | 3001 |
7 | 3002 |
2 | 3006 |
查询 2:
SELECT SUM(sellcount) sellcount,codeprogram,price
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram,price
结果是:
sellcount | codeprogram | price |
---|---|---|
27 | 3001 | 10000 |
25 | 3000 | 20000 |
9 | 3006 | 25000 |
3 | 3011 | 15000 |
8 | 3008 | 11000 |
55 | 3002 | 50000 |
如何加入两个视图,然后从销售数量中减去取消数量,最后将数量乘以价格,在指定的日期范围内?
在每个视图中,我都有字段 date_save(日期时间),它由 getdate() 和用户代码填充。
finalcount = (sellcount - cancelcount) * price
我希望最终输出如下:
finalcount | codeprogram | price |
---|---|---|
20 | 3001 | 200000 |
25 | 3000 | 500000 |
7 | 3006 | 175000 |
3 | 3011 | 45000 |
8 | 3008 | 88000 |
47 | 3002 | 2350000 |
谢谢
您可以尝试将两个子查询与 OUTER JOIN
SELECT sellcount - ISNULL(cancelcount,0) finalcount,
t1.codeprogram,
t1.price
FROM (
SELECT SUM(sellcount) sellcount,codeprogram,price
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram,price
) t1
LEFT JOIN (
SELECT sum(cancels) as cancelcount,codeprogram
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
GROUP By codeprogram
) t2 ON t1.codeprogram = t2.codeprogram
根据您的查询,您可以重写如下,使用 UNION ALL
结合 sells
& CanceliTems
并制作一个标志来表示 1 是
正数,2为负数则使用条件聚合函数。
SELECT SUM(CASE WHEN flag = 1 THEN sellcount ELSE - sellcount END),codeprogram,SUM(price) price
FROM (
SELECT sellcount,codeprogram,price , 1 flag
FROM sells
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
UNION ALL
SELECT cancels,codeprogram,0 , 2
FROM CanceliTems
WHERE date_save BETWEEN '1/21/2022' AND '2/20/2022' and usercode = 8066
) t1
GROUP BY codeprogram