私は別の列にいくつかの選択ステートメントを置くにはどうすればよいです
-
20-09-2019 - |
質問
私は基本的に、私は別の列に結果の出力を持っている必要があります7つのselect文を持っています。通常、私はこのためにクロス集計を使用しますが、私は、テーブルに70億行の上にあるように、このついて行くには、高速、効率的な方法が必要です。私はにVerticaデータベースシステムを使用しています。以下は私の文の例があります:
SELECT COUNT(user_id) AS '20100101' FROM event_log_facts WHERE date_dim_id=20100101
SELECT COUNT(user_id) AS '20100102' FROM event_log_facts WHERE date_dim_id=20100102
SELECT COUNT(user_id) AS '20100103' FROM event_log_facts WHERE date_dim_id=20100103
SELECT COUNT(user_id) AS '20100104' FROM event_log_facts WHERE date_dim_id=20100104
SELECT COUNT(user_id) AS '20100105' FROM event_log_facts WHERE date_dim_id=20100105
SELECT COUNT(user_id) AS '20100106' FROM event_log_facts WHERE date_dim_id=20100106
SELECT COUNT(user_id) AS '20100107' FROM event_log_facts WHERE date_dim_id=20100107
のようなものを返す必要があります:
20100101 | 20100102 | 20100103 | 20100104 | 20100105 | 20100106 | 20100107
1234 | 1234 | 36564 | 45465 | 356754 | 3455 | 4556675
解決
あなたは1つに結合一連のクエリを使用することができます。醜いの種類が、それは動作するはずです。
SELECT
COUNT(user_id) AS '20100101'
,NULL AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100101
UNION
SELECT
NULL AS '20100101'
,COUNT(user_id) AS '20100102'
,NULL AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100102
UNION
SELECT
NULL AS '20100101'
,NULL AS '20100102'
,COUNT(user_id) AS '20100103'
,NULL AS '20100104'
,NULL AS '20100105'
FROM
event_log_facts
WHERE
date_dim_id=20100103
ETC ...
他のヒント
、括弧でそれらをラップカンマを追加し、それらを選択:)
SELECT
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100101) AS '20100101',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100102) AS '20100102',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100103) AS '20100103',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100104) AS '20100104',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100105) AS '20100105',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100106) AS '20100106',
(SELECT COUNT(user_id) FROM event_log_facts WHERE date_dim_id=20100107) AS '20100107'
それとも、パラメータとしてdate_dim_idを取り、あなたが望む結果を返すスカラー関数を作成し、複数回、それを呼び出すことができます。..(のあなたのDBシステムがサポートしている場合は、スカラー関数の)
SELECT
COUNT(date_dim=20100101 OR NULL) AS '20100101',
COUNT(date_dim=20100102 OR NULL) AS '20100102',
...
FROM event_log_facts
さて、ピボットテーブルを使用することを検討してください。それは、よりeyecandyがある:)
まず組合あなたの結果、それを旋回するよりも!
> http://sqlfiddle.com/# -相続人はあなたの例を、ここではSQLFiddle rel="nofollow"> の
SELECT PivT.*
FROM
(
SELECT 10 As Quantity, '20100101' AS DateDim
UNION
SELECT 21 , '20100102'
UNION
SELECT 3 , '20100103'
UNION
SELECT 41 , '20100104'
UNION
SELECT 50 , '20100105'
UNION
SELECT 26 , '20100106'
UNION
SELECT 78 , '20100107'
) T
PIVOT (avg(Quantity) for DateDim in ([20100101],
[20100102],
[20100103],
[20100104],
[20100105],
[20100106],
[20100107])
) As PivT
所属していません StackOverflow