0

以下のように7つの列を持つSQLデータベースがあります

version1; 1993; name; 233; 254; 291; 244
version1; 1994; name; 333; 354; 391; 344 

最後の 4 列は四半期ごとの値を表しており、行ごとに 1 つの値を選択したいので、各行は 4 つの行に抽出されます。さらに、値 (提供された四半期を追跡する列) を追加したいと思います。希望は、上記の 2 つのデータ行が次のように報告されることです。

version1; 1993; 1; name, 233
version1; 1993; 2; name; 254
version1; 1993; 3; name; 291
version1; 1993; 4; name; 244
version1; 1994; 1; name, 333
version1; 1994; 2; name; 354
version1; 1994; 3; name; 391
version1; 1994; 4; name; 344

これを行う簡単な方法はありますか?

前もって感謝します

4

7 に答える 7

1

UNION ALLこれには、またはのいずれかを使用できますUNPIVOTUNPIVOTすべてのRDBMSで利用できるわけではありません。

UNION ALLデモ付きのSQLフィドルを参照):

select col1, col2, col3, 1 quarter, col4
from yourtable
union all
select col1, col2, col3, 2 quarter, col5
from yourtable
union all
select col1, col2, col3, 3 quarter, col6
from yourtable
union all
select col1, col2, col3, 4 quarter, col7
from yourtable

UNPIVOTデモ付きのSQLフィドルを参照):

select col1, col2, col3, 
  cast(replace(field, 'col', '') as int) - 3 quarter, 
value
from 
(
  select col1, col2, col3, col4, col5, col6, col7

  from yourtable
) u
unpivot
(
  value 
  for field in (col4, col5, col6, col7)
)u
于 2012-08-30T16:00:42.970 に答える
1

これにより、目的の形式で出力が得られます。

SELECT version, year, 1 as 'quarter', name, quarter1_value 
FROM myTable

UNION

SELECT version, year, 2 as 'quarter', name, quarter2_value 
FROM myTable

UNION

SELECT version, year, 3 as 'quarter', name, quarter3_value 
FROM myTable

UNION

SELECT version, year, 4 as 'quarter', name, quarter4_value 
FROM myTable
于 2012-08-30T15:50:30.657 に答える
1

を使用UNIONして、目的の結果を得ることができます。これは、MySQLとSQLServerの両方で機能します。UNION次のように使用できます。

SELECT * FROM
(
SELECT version, year, 1 as 'quarter', name, quarter1_value FROM tt
UNION
SELECT version, year, 2 as 'quarter', name, quarter2_value FROM tt
UNION
SELECT version, year, 3 as 'quarter', name, quarter3_value FROM tt
UNION
SELECT version, year, 4 as 'quarter', name, quarter4_value FROM tt
) a
Order by Year, QUARTER

このSQLFiddleを参照してください

于 2012-08-30T15:56:26.730 に答える
0
SELECT version, year, name, '1', quarter_1 FROM table

UNION

SELECT version, year, name, '2', quarter_2 FROM table

UNION

...
于 2012-08-30T15:50:04.117 に答える
0

4 つの四半期を含むテーブルにクロス結合を実行してから、case ステートメントを使用して適切な四半期を選択できます。

SELECT
  ORIG_TABLE.VERSION,
  ORIG_TABLE.YEAR,
  QUARTER_NAMES.Q_NAME,
  ORIG_TABLE.NAME,
  CASE QUARTER_NAMES.Q_NAME
    WHEN 1 
      THEN ORIG_TABLE.Q1_VALUE
    WHEN 2
      THEN ORIG_TABLE.Q2_VALUE
    WHEN 3
      THEN ORIG_TABLE.Q3_VALUE
    WHEN 4
      THEN ORIG_TABLE.Q4_VALUE
 END Q_VALUE
FROM
  ORIG_TABLE
    CROSS JOIN 
    (
       SELECT 1 Q_NAME
       UNION SELECT 2 Q_NAME
       UNION SELECT 3 Q_NAME
       UNION SELECT 4 Q_NAME
    ) QUARTER_NAMES
于 2012-08-30T15:52:25.923 に答える
0

SQL ビューを作成できます。インデックスに基づいて行を返す SQL 分割関数を使用します。リンクからヘルプを得ることができますhttp://geekswithblogs.net/AngelEyes/archive/2007/04/12/111504.aspx

于 2012-08-30T15:53:10.647 に答える
0

DBMS は提供されていないので、念のため SQL-Server 固有のものをいくつか用意します。

-- SAMPLE DATA
DECLARE @T TABLE (Version VARCHAR(15), Year INT, Name VARCHAR(5), Col1 INT, Col2 INT, Col3 INT, Col4 INT)
INSERT @T VALUES
    ('version1', 1993, 'name', 233, 254, 291, 244),
    ('version1', 1994, 'name', 333, 354, 391, 344)

-- CROSS APPLY VALUES
SELECT  Version, Year, RowNum, Name, Value
FROM    @T
        CROSS APPLY 
        (   VALUES 
                (Col1, 1), 
                (Col2, 2), 
                (Col3, 3), 
                (Col4, 4)
        ) t (Value, RowNum)

-- UNPIVOT
SELECT  Version, Year, REPLACE(RowNum, 'Col', '') [RowNum], Name, Value
FROM    @T
        UNPIVOT
        (   Value
            FOR RowNum IN ([Col1], [Col2], [Col3], [Col4])
        ) upvt
于 2012-08-30T15:57:57.620 に答える