Last active
July 7, 2017 05:45
-
-
Save yancya/8b959069336619b4731cab11d03b2af5 to your computer and use it in GitHub Desktop.
CUBE 相当の SQL を生成するメソッド
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# columns example | |
# [ | |
# ['hoge total', 'hoge'], | |
# ['fuga total', 'fuga'], | |
# ['piyo total', 'piyo'], | |
# ] | |
def cube_select_expressions(columns) | |
[true, false].repeated_permutation(columns.size).map { |flags| | |
flags.zip(columns).map { |flag, (total_label, column_name)| | |
flag ? column_name : "'#{total_label}' AS #{column_name}" | |
}.join(', ') | |
} | |
end | |
columns = [ | |
['hoge total', 'hoge'], | |
['fuga total', 'fuga'], | |
['piyo total', 'piyo'], | |
] | |
puts cube_select_expressions(columns).map { |select| | |
<<~SQL | |
SELECT #{select} | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
SQL | |
}.join("\nUNION ALL \n\n") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SELECT hoge, fuga, piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT hoge, fuga, 'piyo total' AS piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT hoge, 'fuga total' AS fuga, piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT hoge, 'fuga total' AS fuga, 'piyo total' AS piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT 'hoge total' AS hoge, fuga, piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT 'hoge total' AS hoge, fuga, 'piyo total' AS piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT 'hoge total' AS hoge, 'fuga total' AS fuga, piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 | |
UNION ALL | |
SELECT 'hoge total' AS hoge, 'fuga total' AS fuga, 'piyo total' AS piyo | |
, COUNT(DISTINCT moge) AS moge_count | |
FROM hoge_fuga_piyo_moges | |
GROUP BY 1, 2, 3 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment