Mysql中使用Union—多表合并之行合并
Union (all)語句格式
select 列名 from 表A
union (all)
select 列名 from 表B
注意事項(xiàng):
- 合并的表的列數(shù)必須是一致的,也就是表的列數(shù)要相同
- union 與union all 對兩個(gè)查詢結(jié)果合并的時(shí)候,如果結(jié)果有重復(fù),union 會(huì)把重復(fù)的值刪除;
- union 與union all不能與order by同時(shí)使用,如果要對結(jié)果進(jìn)行排序,可以用子查詢
案例解析
統(tǒng)計(jì)20170703—20170709周內(nèi)每天及本周累計(jì)銷售金額、訂單量、會(huì)員數(shù)、訂單占比
- 統(tǒng)計(jì)時(shí)間段內(nèi)每天的累計(jì)銷售金額、訂單量、會(huì)員數(shù)
- 統(tǒng)計(jì)本周累計(jì)銷售金額、訂單量、會(huì)員數(shù)
- 訂單占比
- union合并表
- 對比 union all合并表——因?yàn)闆]有重復(fù)數(shù)據(jù),所以兩表合并結(jié)果一樣
-- 1、統(tǒng)計(jì)時(shí)間段內(nèi)每天的累計(jì)銷售金額、訂單量、會(huì)員數(shù)
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- 2、統(tǒng)計(jì)本周累計(jì)銷售金額、訂單量、會(huì)員數(shù)
SELECT SUM(AMT) as total_money
,COUNT(DISTINCT salesID) as total_num_order
,COUNT(DISTINCT dimMemberID) total_num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0;
-- 3、訂單占比
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1
,CONCAT(ROUND( COUNT(DISTINCT salesID)/(SELECT COUNT(DISTINCT salesID)
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- 4、union合并表
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order
,COUNT(DISTINCT dimMemberID) num_member
,CONCAT(ROUND( COUNT(DISTINCT salesID)/(
SELECT COUNT(DISTINCT salesID)
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION
SELECT week(dimDateID,1) /*為了保證列數(shù)一樣,week返回日期為一年中的第幾周 weel(date,1):從周一開始為第一天*/
,SUM(AMT) as total_money
,COUNT(DISTINCT salesID) as total_num_order
,COUNT(DISTINCT dimMemberID) total_num_member
,'100%' as total /*為確保列數(shù)一樣*/
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by week(dimDateID,1); /*出現(xiàn)匯總函數(shù)需要進(jìn)行分組*/
-- 5、對比 union all合并表——因?yàn)闆]有重復(fù)數(shù)據(jù),所以兩表合并結(jié)果一樣
SELECT DATE_FORMAT(dimDateID,'%W') AS week_1
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order
,COUNT(DISTINCT dimMemberID) num_member
,CONCAT(ROUND( COUNT(DISTINCT salesID)/(
SELECT COUNT(DISTINCT salesID)
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0),4)*100,'%') as order_rate
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION ALL
SELECT week(dimDateID,1) /*為了保證列數(shù)一樣,week返回日期為一年中的第幾周 weel(date,1):從周一開始為第一天*/
,SUM(AMT) as total_money
,COUNT(DISTINCT salesID) as total_num_order
,COUNT(DISTINCT dimMemberID) total_num_member
,'100%' as total /*為確保列數(shù)一樣*/
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by week(dimDateID,1); /*出現(xiàn)匯總函數(shù)需要進(jìn)行分組*/區(qū)分union 和 union all ,利用重復(fù)數(shù)據(jù)對比,合并兩個(gè)一模一樣的表
-- union
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;
-- union all
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION ALL
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ;多表合并中的排序問題 order by——把合并后的表作為一個(gè)臨時(shí)表,再進(jìn)行排序注意臨時(shí)表需要命名
排序要對新的列名進(jìn)行排序
SELECT sn.*
FROM (
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W')
UNION
SELECT DATE_FORMAT(dimDateID,'%W') as week_1 /*把時(shí)間轉(zhuǎn)化為星期模式*/
,SUM(AMT) as money
,COUNT(DISTINCT salesID) as num_order /*一個(gè)會(huì)員一周可以下多單,所以要統(tǒng)計(jì)會(huì)員數(shù),需要去重*/
,COUNT(DISTINCT dimMemberID) num_member
FROM dw.fct_sales
where dimDateID between '20170703' and '20170709'
and dimMemberID <>0
group by DATE_FORMAT(dimDateID,'%W') ) as sn
order by money desc; /*注意要對money排序,而不是SUM(AMT)*/
-- order by SUM(AMT) desc; /*會(huì)報(bào)錯(cuò),需要用臨時(shí)表的列名,并且要對臨時(shí)表取列名,否則也會(huì)報(bào)錯(cuò)*/到此這篇關(guān)于Mysql中使用Union—多表合并之行合并的文章就介紹到這了,更多相關(guān)Mysql使用Union行合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
iOS開發(fā)runloop運(yùn)行循環(huán)機(jī)制學(xué)習(xí)
這篇文章主要為大家介紹了iOS開發(fā)runloop運(yùn)行循環(huán)的機(jī)制學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
基于Mysql的IP處理函數(shù)inet_aton()與inet_ntoa()的深入分析
本篇文章是對Mysql的IP處理函數(shù)inet_aton()與inet_ntoa()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Linux(Ubuntu)下Mysql5.6.28安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Linux(Ubuntu)下Mysql5.6.28安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例
Datediff函數(shù),最大的作用就是計(jì)算日期差,能計(jì)算兩個(gè)格式相同的日期之間的差值,下面這篇文章主要給大家介紹了關(guān)于Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例?的相關(guān)資料,需要的朋友可以參考下2022-09-09
關(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明
下面小編就為大家?guī)硪黄P(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
MySQL 獲得當(dāng)前日期時(shí)間 函數(shù)
這篇文章主要介紹了MySQL 獲得當(dāng)前日期時(shí)間 函數(shù) 非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-07-07

