2014-10-11 92 views
0

我必須列出在時間1和時間2之間的一行中不同的 電臺售出的門票數量之間的差異。我有三張桌子:時間1,時間2和地點。在三張桌子上工作,我的分組不工作

create table fares_jan18 (
    station varchar(100), 
    ff int 
); 

create table fares_feb1 (
    station varchar(100), 
    ff int 
); 

create table stations (
    name varchar(100), 
    line varchar(50) 
); 

我使用這個查詢:

SELECT 
    fares_jan18.station AS name, 
    SUM(fares_feb1.ff - fares_jan18.ff) AS diff_feb1_jan18 
FROM 
    fares_jan18 
    JOIN fares_feb1 ON fares_jan18.station = fares_feb1.station 
    JOIN stations ON fares_jan18.station = stations.name 
WHERE 
    stations.line ="Broadway" 
GROUP BY 
    name 
ORDER BY 
    name; 

它確實給我正確的表,但是當曾經有不止一個記錄,我得到的複製差的總和。例如,具有兩個值的電臺的結果應該是33254,並且「給我66508」。我已經從我的查詢中刪除了該組,但似乎是記錄而不是兩個。

我已經閱讀了所有我可以在StackOverflow,但我無法讓我的頭在我做錯了什麼?謝謝!!

這裏是我的表的圖像:

image

+0

您在查詢中使用的表格不同於您在頂部顯示的表格。 – Barmar 2014-10-11 01:23:51

+0

我刪除了不必要的列並更改了表名以反映查詢。希望我的編輯不是實質性的或被認爲是無效的。 – jpw 2014-10-11 01:36:45

回答

0

你需要預先聚集每個單獨或者你得到一個笛卡爾結果......由於查詢是針對單個百老匯,一個記錄將導致各站工作的每個日期的數據時加入來源

SELECT 
     justF18.name, 
     justFeb1.SumFF - justF18.SumFF as FF_Diff 
    from 
     (SELECT f18.station AS name, 
       SUM(f18.ff) AS Sumff 
      FROM 
       fares_jan18 f18 
       JOIN stations s ON f18.station = s.name 
       AND s.line = "Broadway" 
      group by 
       f18.station) justF18 
     JOIN 
     (SELECT feb1.station AS name, 
       SUM(feb1.ff) AS Sumff 
      FROM 
       fares_feb1 feb1 
       JOIN stations s ON feb1.station = s.name 
       AND s.line = "Broadway" 
      group by 
       feb1.station) justFeb1 
     ON justF18.name = justFeb1.name 
    order by 
     JustFeb18.name 
+0

謝謝,現在我知道,首先我必須在每個表格中單獨執行操作。 – Panda 2014-10-11 20:15:49

3

你在兩個票價表創建都具有相同的站行的笛卡爾積,然後相加每一對的差異。您需要分別在子查詢中計算每個表中的總計,然後減去它們。

SELECT s.name, feb1.total - jan18.total AS diff_feb1_jan18 
FROM stations AS s 
JOIN (SELECT station, SUM(ff) AS total 
     FROM fares_feb1 
     GROUP BY station) AS feb1 
    ON feb1.station = s.station 
JOIN (SELECT station, SUM(ff) AS total 
     FROM fares_jan18 
     GROUP BY station) AS jan18 
    ON jan18.station = s.station 
WHERE s.line = "Broadway" 
ORDER BY s.name 
+0

我只是將s.station中的列名更改爲s.name,因爲它是該表中列的名稱,然後它完美地工作。我理解了這個邏輯,它也適用於另一個問題。非常感謝。 – Panda 2014-10-11 20:12:02

相關問題