34,591
社区成员
发帖
与我相关
我的任务
分享
SELECT a.sDay AS a日期, b.fare AS b金额, b.cardfare AS b会员金额, (b.moneyFare) AS b现金金额, (b.otherFare) AS b其他金额, (b.cent) AS b产生积分, (c.Fare) AS c充值金额, (c.sFare) AS c赠送金额, (c.sumfare) AS c实际充值, (d.sumcent) AS d兑换积分
FROM SumDay AS a, [select sum(e.yfare)as fare,sum(e.cardfare) as cardfare,sum(e.moneyFare)as moneyFare,sum(e.otherFare)as otherFare,sum(e.cent)as cent from consume as e
where (Format(e.SellDate,"yyyy-mm-dd"))= #2016-10-04#
group by (Format(e.SellDate,"yyyy-mm-dd")) ]. AS b, [select sum(f.Fare) as fare,sum(f.sFare) as sFare,sum(f.fare+f.sfare) as sumfare from Cashrec as f
where (Format(f.cashrecDate,"yyyy-mm-dd"))=#2016-10-04#
group by (Format(f.cashrecDate,"yyyy-mm-dd")) ]. AS c, [select sum(g.reccent)as sumcent from cent as g
where (Format(g.CentDate,"yyyy-mm-dd"))= #2016-10-04#
group by (Format(g.centDate,"yyyy-mm-dd")) ]. AS d
WHERE (((a.sDay)=#10/4/2016#))
ORDER BY a.sDay DESC;
SELECT a2 ,
SUM(a1) AS a1 ,
SUM(b1) AS b1
FROM ( SELECT 0 AS a1 ,
a2 ,
0 AS b1
FROM TableA
UNION ALL
SELECT 0 AS a1 ,
b2 ,
b1
FROM TableB
) AS t
GROUP BY a2;
SELECT ISNULL(T1.a2, ISNULL(T2.b2,T3.c2)) AS [DATE], T1.SUM_T1,T2.SUM_T2,T3.SUM_T3
FROM
(SELECT SUM(a1) AS SUM_T1,a2 FROM #TABLEA where a2 between '2016-10-01' and '2016-10-04' GROUP BY a2) T1
FULL JOIN
(SELECT SUM(b1) AS SUM_T2,b2 FROM #TABLEB where b2 between '2016-10-01' and '2016-10-04' GROUP BY b2) T2
ON T1.a2 = T2.b2
FULL JOIN
(SELECT SUM(c1) AS SUM_T3,c2 FROM #TABLEc where c2 between '2016-10-01' and '2016-10-04' GROUP BY c2) T3
ON T1.a2 =T3.c2
ISNULL(T1.a2, ISNULL(T2.b2,T3.c2))按编程语言的理解就是
if T1.a2 IS NOT NULL
THEN T1.a2
else if T2.b2 IS NOT NULL
THEN T2.b2
else T3.c2CREATE TABLE #TABLEA
(
a1 INT,
a2 DATE
);
INSERT INTO #TABLEA VALUES
(8,'2016-10-01'),
(8,'2016-10-01'),
(8,'2016-10-02'),
(12,'2016-10-04'),
(12,'2016-10-04');
CREATE TABLE #TABLEB
(
b1 INT,
b2 DATE
);
INSERT INTO #TABLEB VALUES
(123,'2016-10-01'),
(123,'2016-10-01'),
(123,'2016-10-03'),
(24,'2016-10-04'),
(24,'2016-10-04')
SELECT
ISNULL(T1.a2, T2.b2) AS [DATE],
T1.SUM_T1,
T2.SUM_T2
FROM
(
SELECT SUM(a1) AS SUM_T1,a2 FROM #TABLEA GROUP BY a2
) T1
FULL JOIN
(
SELECT SUM(b1) AS SUM_T2,b2 FROM #TABLEB GROUP BY b2
) T2
ON T1.a2 = T2.b2
DROP TABLE #TABLEA
DROP TABLE #TABLEB
我在#1的数据基础上分别给表A和B加入了一组独有的日期数据
同时使用FULL JOIN来连接两个子查询,查询结果的日期列也考虑到其中一项为空的情况
如果有更多的表连接,日期列可以继续扩展ISNULL(T1.DATE,ISNULL(T2.DATE,ISNULL(T3.DATE,……)))
但是根据具体的业务需求,如果一个日期在表A中出现,必定会在所有的表中出现,那么就建议使用INNER JOIN连接处理
日期列也可以直接写成T1.DATE
SELECT ISNULL(T1.a2, T2.b2) AS [DATE], T1.SUM_T1,T2.SUM_T2,T3.SUM_T3
FROM
(SELECT SUM(a1) AS SUM_T1,a2 FROM #TABLEA where a2 between '2016-10-01' and '2016-10-04' GROUP BY a2) T1
FULL JOIN
(SELECT SUM(b1) AS SUM_T2,b2 FROM #TABLEB where b2 between '2016-10-01' and '2016-10-04' GROUP BY b2) T2
ON T1.a2 = T2.b2
FULL JOIN
(SELECT SUM(c1) AS SUM_T3,c2 FROM #TABLEc where c2 between '2016-10-01' and '2016-10-04' GROUP BY c2) T3
ON T1.a2 =T3.c2