2017-04-19 57 views
-1

我創建了一個查詢,該查詢給出了當天每個部門的銷售額總和。將數據填充爲月份中的單個日期作爲列

我想要的是使用一個主查詢生成整個月的這些數據。

這是我希望看到的結果:

Department No Department Name 1-April 2-April 3-April 
1    Infants   100  112  96 
2    Kids    120  132  123 
Total Total      220  144  219 

目前,我可以生成這個只有一天,我必須不斷地改變日期值獲取數據的第二天。

如前所述,我想在一個主查詢中運行一個整月。

+1

添加示例表數據和您當前的代碼/查詢。 – jarlh

+3

爲了提高您的問題質量,請向我們展示您使用的代碼以及表格的字段以及樣本數據。另外,請向我們展示您迄今爲止開發的代碼。最後,如果您可以包含腳本來創建和填充這些表格,那麼這將使我們能夠輕鬆地重現您的情況。 – toonice

+0

這是我用它來生成每天銷售 選擇部門名稱, 部門不, 和代碼(銷售總額)* - 1爲Net_Amount 從項目主 其中日期=「2017年4月1日」 GROUP BY部名稱,部門號 – Sequel3

回答

-2

你可以像這樣控制的日期範圍:

select (...) where v_date >= 1-April and v_date <= 30-April 

(考慮v_date列的名稱,1 - 4月份的數據格式)

+0

這不會得到我想要的結果 – Sequel3

+0

該僞代碼只會獲得指定時間段內記錄的指定字段。 'Sequel3'要求日期值本身成爲字段,其中該日期的銷售額和該部門填寫所創建的字段的總和。 – toonice

+0

好的,謝謝你的解釋。 猜猜我錯了。 – rtrigo

0

請嘗試以下...

SELECT CONCAT('SELECT department.id AS `Department No`, 
         department.departmentName AS `Department Name`', 
       GROUP_CONCAT(', SUM(date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.sales) AS `', 
          DATE_FORMAT(salesDate, '%e-%M'), 
          '`', 
          SEPARATOR ''), 
       ' FROM department', 
       GROUP_CONCAT(' LEFT JOIN departmentSales AS date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          ' ON department.id = date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.department_id AND date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.salesDate = `', 
          DATE_FORMAT(salesDate, '%Y-%M-%d'), 
          '`', 
          SEPARATOR ''), 
       ' GROUP BY department.id 
       ORDER BY department.id 
       UNION 
       SELECT `Totals`, 
         ` `, 
       GROUP_CONCAT(', SUM(date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.sales)', 
          SEPARATOR ''), 
       ' FROM department', 
       GROUP_CONCAT(' LEFT JOIN departmentSales AS date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          ' ON department.id = date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.department_id AND date_', 
          DATE_FORMAT(salesDate, '%d_%M'), 
          '.salesDate = `', 
          DATE_FORMAT(salesDate, '%Y-%M-%d'), 
          '`', 
          SEPARATOR ''), 
       ') INTO @salesQuery 
FROM (SELECT DISTINCT salesDate 
     FROM departmentSales 
     WHERE salesDate BETWEEN FROM_DAYS(TO_DAYS(targetDate) - 
              DAYOFMONTH(targetDate) + 
              1 
             ) 
          AND LAST_DAY(targetDate) 
    ) AS salesDateFinder; 

PREPARE salesTotals FROM @salesQuery; 
EXECUTE salesTotals; 

這種嘗試是基於在mysql select dynamic row values as column names, another column as value發現的代碼。我擔心group_concat_max_len變量是一個問題。如果是的話,我會加強對CASE方法的研究。如果這不是問題,那麼我會更輕鬆一些。

這裏的大多數行實際上只構成一個SQL語句。它接受子查詢在末尾構造的salesDate值列表,然後用它們構造一個相當長的字符串,其中包含要針對數據庫運行的SQL語句。

該字符串由指定爲函數CONCAT()的參數的子字符串列表形成,您可以在https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat上閱讀該函數。

的字符串開始通過指定從表department領域iddepartmentName應選擇每條記錄的首位,其次是每個日期的銷售該部門的SUM()。每個日期字段都有一個名稱,例如date_09_March,輸出的標題類似9-March

通過使用GROUP_CONCAT函數可以實現字符串的重複段,您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat處閱讀該函數。

被指定的字符串的字段之後指定該值應來自從departmentLEFT JOIN ED與departmentSales錶針對每個日期的一個實例形成的臨時表,其中每個實例上被賦予別名等date_09_March和接合在其department_id字段到id字段department

一旦它形成,臨時表的記錄按department.id分組,以便可以計算每個部門的總計。然後輸出按department.id排序。

用於生成此排序輸出及其列標題的語句隨後會連接到用於生成總計行的另一個(稍微簡單)的語句。然後將包含由每個子串串聯形成的SQL語句的字符串分配給準備並執行的變量@salesQuery。

如果您有任何問題或意見,請隨時發佈相應評論。

進一步閱讀

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html(對於所使用的DATE功能的信息)

+0

構建了自己的查詢。此外,修改代碼以包含一個'WHERE'子句,該子句將選擇的日期限制爲這裏稱爲'targetDate'的日期的月份。 'targetDate'可以是一個月內的任何日期。 – toonice

0

感謝所有的答案 我設法寫基於透視功能的查詢。

相關問題