1

複数の列を持つ「トランザクション」と呼ばれるデータベース テーブルがあります。トランザクション行ごとに、指定されたリストから列ごとに1行でエクスポートを生成する必要があります

取引表

ID、DoNotEmail、DoNotMail、DoNotPhone、DoNotSMS
1000、真、偽、真、真

次のルールを適用する必要があります。

DoNotEmail が設定され、「DNE」が出力される

DoNotMail が設定され、出力 'DNM'

DoNotPhone が設定され、「DNP」が出力されます

DoNotSMS が設定され、「DNS」が出力されます

エクスポートは次のようにする必要があります。

ID、抑制
1000、DNE
1000、大日本印刷
1000、DNS

私は本当に混乱しており、それを機能させる唯一の方法は、すべての列を2つの一時テーブルに挿入するステートメントを使用することです。うーん。

これは可能ですか?

助けてくれてありがとう。

ダレン

psフォーマットについて申し訳ありません。

4

5 に答える 5

6

列が 4 つしかない場合、これはおそらく機能します。

SELECT id, 
       'DNE' AS Suppressions 
FROM   transactions 
WHERE  donotemail = 'true' 
UNION ALL 
SELECT id, 
       'DNM' AS Suppressions 
FROM   transactions 
WHERE  donotmail = 'true' 
UNION ALL 
SELECT id, 
       'DNP' AS Suppressions 
FROM   transactions 
WHERE  donotphone = 'true' 
UNION ALL 
SELECT id, 
       'DNS' AS Suppressions 
FROM   transactions 
WHERE  donotsms = 'true' 

SQL フィドルのデモ

于 2013-02-28T15:35:55.117 に答える
6

これを書くことができる別の方法は次のとおりです。

SELECT id,
  case col 
    when 'DoNotEmail' then 'DNE'
    when 'DoNotMail' then 'DNM'
    when 'DoNotPhone' then 'DNP'
    when 'DoNotSMS' then 'DNS'
  end Suppressions
FROM 
(
  SELECT t.ID,
    s.col,
    CASE s.col
      WHEN 'DoNotEmail' THEN DoNotEmail
      WHEN 'DoNotMail' THEN DoNotMail
      WHEN 'DoNotPhone' THEN DoNotPhone
      WHEN 'DoNotSMS' THEN DoNotSMS
    END AS DATA
  FROM Transactions t
  CROSS JOIN 
  (
    SELECT 'DoNotEmail' AS col
    UNION ALL SELECT 'DoNotMail'
    UNION ALL SELECT 'DoNotPhone'
    UNION ALL SELECT 'DoNotSMS'
  ) s
) s
where data = 'true';

SQL Fiddle with Demoを参照してください。

SQL Server を使用しているため、UNPIVOT関数を実装できます。

select id,
  case col 
    when 'DoNotEmail' then 'DNE'
    when 'DoNotMail' then 'DNM'
    when 'DoNotPhone' then 'DNP'
    when 'DoNotSMS' then 'DNS'
  end Suppressions
from Transactions
unpivot
(
  value 
  for col in ([DoNotEmail], [DoNotMail], [DoNotPhone], [DoNotSMS])
) piv
where value = 'true'

デモで SQL Fiddle を参照してください

于 2013-02-28T15:49:41.560 に答える
4

これは、SQL Server 2008 以降で機能します。必要に応じて、SQL Server 2005 でも動作するように変更できます。

select T1.ID,
       T2.Name
from Transactions as T1
  cross apply (values (DoNotEmail, 'DNE'), 
                      (DoNotMail,  'DNM'), 
                      (DoNotPhone, 'DNP'), 
                      (DoNotSMS,   'DNS')
              ) as T2(Value, Name)
where T2.Value = 'true' 
于 2013-02-28T16:21:58.710 に答える
1

CROSS JOIN4 レコード テーブルでは、テーブルを 4 回スキャンする必要がなくなります。bluefeet は、この最初の (+1) を使用して回答を投稿しました。これは、Oracle を使用した同様のバージョンです。

SELECT id, Suppressions FROM
(
  SELECT id, 
     CASE 
        WHEN Col = 1 AND donotemail = 'true' THEN 'DNE'
        WHEN Col = 2 AND donotmail  = 'true' THEN 'DNM'
        WHEN Col = 3 AND donotphone = 'true' THEN 'DNP'
        WHEN Col = 4 AND donotsms   = 'true' THEN 'DNS'
        ELSE NULL
     END Suppressions 
  FROM Transactions
  CROSS JOIN (SELECT Level Col FROM dual CONNECT BY Level <=4)
)
WHERE Suppressions IS NOT NULL;

SQL フィドル

于 2013-02-28T16:16:46.527 に答える
0
select ID, 'DNE' as 'Suppressions'
from transactions
where DoNotEmail = 'true'
UNION ALL
select ID, 'DNM' as 'Suppressions'
from transactions
where DoNotMail = 'true'
UNION ALL
select ID, 'DNS' as 'Suppressions'
from transactions
where DoNotPhone = 'true'
UNION ALL
select ID, 'DNE' as 'Suppressions'
from transactions
where DoNotSMS = 'true'
order by ID
于 2013-02-28T15:37:40.187 に答える