0

これが私のテーブルの例です:

ID     Name     ClickLink1     ClickLink2     ClickLink3
--     ----     ----------     ----------     ----------
1      John     Landing                       ThankYou
2      Abby     ThankYou       Landing        Landing
3      Chris                   ThankYou
4      Sam      Landing        ThankYou       ThankYou

次のような結果を探しています。

Page       Link         Count
----       ----         -----
Landing    ClickLink1   2
Landing    ClickLink2   1
Landing    ClickLink3   1

最終的には、「ThankYou」ページの別のレポートでクエリを繰り返しますが、「Landing」ページのクエリに基づいて簡単に複製できます。

SQL Server 2008 R2 の使用

4

5 に答える 5

2

主な問題は、現在のテーブルが非正規化されているため、列全体でカウントする必要があることです。これを行う 1 つの方法は、データを複数の列から複数の行にアンピボットすることです。

これを行うには、いくつかの方法があります。UNION ALL を使用して列を行に変換し、値をカウントできます。

select page, link, count(*) Total
from
(
  select ClickLink1 as page, 'ClickLink1' as link
  from yourtable
  union all
  select ClickLink2 as page, 'ClickLink2' as link
  from yourtable
  union all
  select ClickLink3 as page, 'ClickLink3' as link
  from yourtable
) d
where page = 'Landing'
group by page, link;

SQL Fiddle with Demoを参照してください。もう 1 つの方法は、仮想テーブルに CROSS JOIN を使用して値をカウントすることです。

SELECT page, 
  col as link,
  COUNT(*) AS TOTAL
FROM 
(
  SELECT col, 
    CASE s.col
      WHEN 'ClickLink1' THEN ClickLink1
      WHEN 'ClickLink2' THEN ClickLink2
      WHEN 'ClickLink3' THEN ClickLink3
    END AS page
  FROM yourtable
  CROSS JOIN 
  (
    SELECT 'ClickLink1' AS col UNION ALL 
    SELECT 'ClickLink2' UNION ALL 
    SELECT 'ClickLink3'
  ) s
) s
where page = 'Landing'
group by page, col;

SQL Fiddle with Demoを参照してください。使用しているデータベースによっては、集計とともに UNPIVOT 関数を使用して結果を取得できる場合があります。たとえば、SQL Server を使用している場合は、次を使用できます。

select page, link, count(*) Total
from yourtable
unpivot
(
  page
  for link in (ClickLink1, ClickLink2, ClickLink3)
) unpiv
where page = 'Landing'
group by page, link;

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

于 2013-07-29T17:22:21.837 に答える
1

これは以下で実行できると思いますが、DBMS フレーバーを提供していないため、不可知論的な解決策になるはずです。

SELECT ClickLink1 as Page, 'ClickLink1' as Link, Count(ID) as Count
FROM myTable
GROUP BY ClickLink1
UNION
SELECT ClickLink2 as Page, 'ClickLink2' as Link, Count(ID) as Count
FROM myTable
GROUP BY ClickLink2
UNION
SELECT ClickLink3 as Page, 'ClickLink3' as Link, Count(ID) as Count
FROM myTable
GROUP BY ClickLink3
于 2013-07-29T17:25:35.007 に答える
0

解決策はアンピボットだと思います。

create table #a
(
    id int identity,
    Name varchar(500),
    ClickLink1 varchar(500),
    ClickLink2 varchar(500),
    ClickLink3 varchar(500),
)
insert into #a
select 'John','Landing',null,'ThankYou'
union
select 'Abby','ThankYou','Landing','Landing'
union
select 'Chris',null,'ThankYou',null
union
select 'Sam','Landing','ThankYou','ThankYou'

select Name,PAge,COUNT(*) count
from (
    select *
    from #a
)p
UNPIVOT
   (Page FOR clicklink IN 
      (ClickLink1, ClickLink2, ClickLink3)
)AS unpvt
where Page = 'Landing'
group by Name,PAge
于 2013-07-29T17:43:39.490 に答える
0

SQL Server を使用している場合は、データをEAVに変換する必要があるときに常に使用する transfer to XML トリックを使用できます。これは非常に一般的で、保守と変更が簡単です。

declare @Data xml

select @Data = 
(
    select *
    from test
    for xml raw('Data')
)

;with cte as
(
  select
      T.C.value('.', 'nvarchar(128)') as Page,
      T.C.value('local-name(.)', 'nvarchar(128)') as Link 
  from @Data.nodes('Data/@*') as T(C)
)
select Page, Link, count(*)
from cte
where Page = 'Landing'
group by Page, Link

SQL フィドルの例

于 2013-07-29T17:27:06.247 に答える