請嘗試以下...
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
領域id
和departmentName
應選擇每條記錄的首位,其次是每個日期的銷售該部門的SUM()
。每個日期字段都有一個名稱,例如date_09_March
,輸出的標題類似9-March
。
通過使用GROUP_CONCAT
函數可以實現字符串的重複段,您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat處閱讀該函數。
被指定的字符串的字段之後指定該值應來自從department
LEFT 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
功能的信息)
添加示例表數據和您當前的代碼/查詢。 – jarlh
爲了提高您的問題質量,請向我們展示您使用的代碼以及表格的字段以及樣本數據。另外,請向我們展示您迄今爲止開發的代碼。最後,如果您可以包含腳本來創建和填充這些表格,那麼這將使我們能夠輕鬆地重現您的情況。 – toonice
這是我用它來生成每天銷售 選擇部門名稱, 部門不, 和代碼(銷售總額)* - 1爲Net_Amount 從項目主 其中日期=「2017年4月1日」 GROUP BY部名稱,部門號 – Sequel3