2016-03-08 31 views
1

以下是兩個單獨運行時按預期工作的SQL查詢。我已經試過把它們揉成一個SQL,但是顯然是由於每一個返回的列數不同,所以我不能使用這些技術。SQL - 在select語句中將具有不同列數的兩個查詢合併爲一個

我使用的數據是here

這裏是我試圖合併

查詢一個

SET group_concat_max_len = 100485760;   
SELECT 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 50/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS aa 
    ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 75/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS bb 
    ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 85/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS cc 
    ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 95/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS dd 
    ,MAX(NUM_PRODS) AS MAAX 
FROM 
    SALES_INFO 

查詢的兩個

兩個單獨的查詢
SET group_concat_max_len = 100485760; 
SELECT 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 75/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS ee 
FROM 
    SALES_INFO 
WHERE 
     SALE_DATE >= DATE_SUB(curdate(), INTERVAL 2 WEEK) 

我可以請求幫助將這兩個查詢合併爲一個嗎?

+0

您需要確定每個記錄集獨有的列。在聯合部分中,將每個表或記錄集中可用的列的空值或默認值指定爲公用表表達式。你現在可以像你喜歡的那樣查詢CTE。如果你不知道,你可以閱讀關於 CTE。 SQL服務器中一個非常有用的工具。你也可以將它等同於mysql。 – Ammog

+0

其他地方並沒有那麼有用 – Strawberry

+0

您可以添加NULL作爲佔位符 – Strawberry

回答

1

您可以選擇使用子查詢,像這樣:

SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 50/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS 50per 
     ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 75/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS 75per 
     ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 85/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS 85per 
     ,CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 95/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS 95per  
     ,MAX(NUM_PRODS) AS MAAX 
     ,(SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR ','),',', 75/100 * COUNT(*) + 1),',', -1) AS DECIMAL) AS 2weeks 
     FROM SALES_INFO 
     WHERE SALE_DATE >= DATE_SUB(curdate(), INTERVAL 2 WEEK) 
     ORDER BY 2weeks limit 1) as 2weeks 
FROM 
    SALES_INFO 

你沒有,如果指定此兩個查詢,也沒有自己的數據結構之間的關係,所以現在它限制了第一個結果那不是你所需要的,更新你的要求,我會更新答案。

+0

完美的Sagi。謝謝。對答案稍作修改。內部選擇查詢需要看起來像這樣 - 「SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(NUM_PRODS ORDER BY NUM_PRODS SEPARATOR','),',',75/100 * COUNT(*)+ 1),',' -1)AS DECIMAL)AS 2周 FROM SALES_INFO WHERE SALE_DATE> = DATE_SUB(curdate(),INTERVAL 2 WEEK)ORDER BY 2weeks limit 1)' – usert4jju7

+0

如果您可以用此更新答案,我馬上就會接受它 – usert4jju7

+0

沒有看到你改變了,但完成了。 @ usert4jju7 – sagi