2

値がTRUEまたは1の場合にビット列の名前を返す選択クエリを作成しようとしています.それを行う唯一の方法は、追加の列「日」を追加し、その日の説明に利用可能なチケットが利用可能な列の名前。

これどうやってするの?

<cfquery name="getTickets" datasource="test">
SELECT * from tickets
ORDER BY ticketID ASC
</cfquery> 

チケット表 (回避策):

ticketID  Monday Tuesday Wednesday Price  Day

1         1      0       0         42.00  Monday
2         0      1       0         42.00  Tuesday
3         0      0       1         42.00  wednesday
4         1      1       1         75.00  All three days

チケット表(使いたいもの):

ticketID  Monday Tuesday Wednesday Price

1         1      0       0         42.00
2         0      1       0         42.00
3         0      0       1         42.00
4         1      1       1         75.00
4

2 に答える 2

3

プレゼンテーション レイヤー、つまりクライアント エンドでこれを行うことを強くお勧めします。ただし、ここに可能性があります。

サンプルデータ

create table Tickets(ticketID int, Monday bit, Tuesday bit, Wednesday bit, Price money);
insert into Tickets values (1, 1, 0, 0, 42.00);
insert into Tickets values (2, 0, 1, 0, 42.00);
insert into Tickets values (3, 0, 0, 1, 42.00);
insert into Tickets values (4, 1, 1, 1, 75.00);
insert into Tickets values (5, 0, 0, 0, 15.00);

可能なクエリ

select *,
       STUFF(
       case when Monday=1 then ',Monday' else '' end
     + case when Tuesday=1 then ',Tuesday' else '' end
     + case when Wednesday=1 then ',Wednesday' else '' end, 1,1,'')
from Tickets;

エッジ ケース (「3 日すべて」および「なし」) を明確にするために、CASE ステートメントを使用できます。

select *,
       CASE WHEN Monday=1and Tuesday=1and Wednesday=1
            THEN 'All three days'
            WHEN Monday=0and Tuesday=0and Wednesday=0
            THEN 'None'
            ELSE
       STUFF(
       case when Monday=1 then ',Monday' else '' end
     + case when Tuesday=1 then ',Tuesday' else '' end
     + case when Wednesday=1 then ',Wednesday' else '' end, 1,1,'')
            END WhichDays
from Tickets;
于 2013-05-16T20:07:58.897 に答える
0

アンピボットを試す

;with cte as 
(
  SELECT * FROM 
  ( 
    SELECT * FROM tickets 
  ) v
  UNPIVOT
  ( 
    Available FOR Days IN (Monday, Tuesday, Wednesday) 
  ) up
  where Available = 1
)

SELECT ticketid, price, available,
stuff((
    SELECT ', ' + Days
    FROM cte as t1
    where t1.ticketId = t2.TicketId
    FOR XML PATH('')
    ), 1, 2, '')
from cte t2
group by ticketid, price, available;

SQLデモ

于 2013-05-16T20:12:41.007 に答える