Skip to content

Instantly share code, notes, and snippets.

@yancya
Last active July 7, 2017 05:45
Show Gist options
  • Save yancya/8b959069336619b4731cab11d03b2af5 to your computer and use it in GitHub Desktop.
Save yancya/8b959069336619b4731cab11d03b2af5 to your computer and use it in GitHub Desktop.
CUBE 相当の SQL を生成するメソッド
# 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")
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