iT邦幫忙

0

SQL 資料比對

  • 分享至 

  • xImage

請教一下
我有個SQL SELECT
內容有
門市 銷售年月 銷售金額 成交比例
但由於需要比較去年同期
目前可正確抓取資料了
但是 想把兩張SELECT表用LEFT JOIN 合併
但是因為 兩表唯一同樣的就只有門市
會造成 對應後無法一對一的對應
而重複JOIN
門市 販售年月 營業淨額 訪客數 販售年月 營業淨額 訪客數
豐原店 2018/01 51000 289 2019/01 51000 250
豐原店 2018/01 51000 289 2019/02 50000 200

目前想法是年月去做 2次篩選 但是 又要細分到月份
想請教有無辦法???

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
rogeryao
iT邦超人 8 級 ‧ 2019-09-18 13:00:55
最佳解答

去年同期 : 去年同一月份
用 Stored Procedure 處理 : 計算單月資料只需寫一次

CREATE FUNCTION [dbo].[RptYear_01]
(
  -- 販售年 4 碼
  @YearStart nvarchar(4),
  -- 門市代號
  @BranchID nvarchar(max)
) 
RETURNS TABLE
AS
RETURN (
-- 取得指定年的資料(你原本單月的 SQL...)
SELECT BranchID,'販售年月',SUM(..)...
FROM ...
WHERE 1=1
AND '販售年月' LIKE @YearStart+'%'
AND BranchID=@BranchID
....
GROUP BY '販售年月',BranchID
)

若豐原店 : BranchID = MM01

SELECT *
FROM RptYear_01('2019','MM01') AS A
LEFT JOIN RptYear_01('2018','MM01') AS B
ON RIGHT(A.'販售年月',2) = RIGHT(B.'販售年月',2) AND A.BranchID=B.BranchID
WHERE 1=1
ORDER BY A.BranchID,A.'販售年月'

請教一下這是利用單店查詢比較
這有可能擴展到多店一併查詢比較嗎??
因為以目前的狀態 單店處理已OK
多店照原先的系統是沒有辦法的(不知前人的需求是否有提過)

rogeryao iT邦超人 8 級 ‧ 2019-09-18 16:52:17 檢舉

所有店 :

CREATE FUNCTION [dbo].[RptYear_02]
(
  -- 販售年 4 碼
  @YearStart nvarchar(4)
) 
RETURNS TABLE
AS
RETURN (
-- 取得指定年的資料(你原本單月的 SQL...)
SELECT BranchID,'販售年月',SUM(..)...
FROM ...
WHERE 1=1
AND '販售年月' LIKE @YearStart+'%'
....
GROUP BY '販售年月',BranchID
)
SELECT *
FROM RptYear_02('2019') AS A
LEFT JOIN RptYear_02('2018') AS B
ON RIGHT(A.'販售年月',2) = RIGHT(B.'販售年月',2) AND A.BranchID=B.BranchID
WHERE 1=1
ORDER BY A.BranchID,A.'販售年月'
rogeryao iT邦超人 8 級 ‧ 2019-09-18 17:01:27 檢舉

指定多店 : MM01,MM02,MM03

CREATE FUNCTION [dbo].[RptYear_03]
(
  -- 販售年 4 碼
  @YearStart nvarchar(4),
  -- 門市代號
  @BranchID nvarchar(max)
) 
RETURNS TABLE
AS
RETURN (
-- 取得指定年的資料(你原本單月的 SQL...)
SELECT BranchID,'販售年月',SUM(..)...
FROM ...
WHERE 1=1
AND '販售年月' LIKE @YearStart+'%'
AND BranchID in (@BranchID)
....
GROUP BY '販售年月',BranchID
)
SELECT *
FROM RptYear_03('2019','MM01,MM02,MM03') AS A
LEFT JOIN RptYear_03('2018','MM01,MM02,MM03') AS B
ON RIGHT(A.'販售年月',2) = RIGHT(B.'販售年月',2) AND A.BranchID=B.BranchID
WHERE 1=1
ORDER BY A.BranchID,A.'販售年月'
0
小魚
iT邦大師 1 級 ‧ 2019-09-18 13:04:08

聽起來是歷史共業.

/images/emoticon/emoticon20.gif

我要發表回答

立即登入回答