0

質問のタイトルが悪いのでごめんなさい。ここで明確にできるといいのですが、これが技術的にCTEなのか、それともCTEのように見えるのかはわかりません。とにかく、最初に出力を見ると、私が探しているものをよりよく説明するのに役立ちます。

var_Year  var_Month   var_Day   Total_Downloads
2013      2           25        100
2013      2           24        200
2013      2           23        100
2013      2           22        200
2013      2           21        100

合計だけでなく、製品ごとのダウンロード数を表示する2つの追加列が必要です。その場合、必要な出力は次のようになります。

var_Year  var_Month   var_Day   Total_Downloads   Downloads_Prod_A    Downloads_Prod_B
2013      2           25        100               50                  50
2013      2           24        200               90                  110
2013      2           23        100               25                  75
2013      2           22        200               125                 75
2013      2           21        100               90                  10

これが現在のSQLクエリですが、「製品A」と「製品B」の定義がありません。「f_product」は、「ProductA」または「ProductB」のいずれかを含むデータベース内のフィールドであると想定します。

SELECT var_Year, var_Month, var_Day, COUNT(var_Day) AS "Total_Downloads"
 FROM
  ( SELECT 
    DISTINCT f_downloadIPaddress, 
    DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
    DATEPART(MONTH,f_downloadtimestamp) as var_Month,
    DATEPART(DAY,f_downloadtimestamp) as var_Day
    FROM tb_downloads
  ) tb_tempcalendar
 GROUP BY var_Year, var_Month, var_Day
 ORDER BY var_Year desc, var_Month desc, var_Day DESC

現在のCTE内に別のCTEが必要かどうか、またはCOUNT(DISTINCT x)メソッドで実行できるかどうかを判断できないため、困惑しています。どんな援助も大歓迎です。SQL Server2008R2の使用。

よろしくお願いします、Beems

4

2 に答える 2

3

以前の質問を削除した理由はよくわかりませんが、とにかく、そこに投稿した回答はまだ有効なようです。試してみましたか。答えは次のとおりです。

あなたが持っているのは「派生テーブル」であり、CTEではありません。さて、次のように、テーブルを直接クエリできると思います。

SELECT  DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
        DATEPART(MONTH,f_downloadtimestamp) as var_Month,
        DATEPART(DAY,f_downloadtimestamp) as var_Day,
        COUNT(DISTINCT f_downloadIPaddress) Total_Downloads,
        COUNT(DISTINCT CASE WHEN f_product = 'Product A' 
                           THEN f_downloadIPaddress END) Downloads_Prod_A,
        COUNT(DISTINCT CASE WHEN f_product = 'Product B' 
                           THEN f_downloadIPaddress END) Downloads_Prod_B
FROM tb_downloads
GROUP BY DATEPART(YEAR,f_downloadtimestamp),
         DATEPART(MONTH,f_downloadtimestamp),
         DATEPART(DAY,f_downloadtimestamp)
ORDER BY var_Year desc, var_Month desc, var_Day DESC
于 2013-02-25T18:24:40.330 に答える
2

はい、あなたはこれを行うことができますcount (distinct)

SELECT var_Year, var_Month, var_Day, COUNT(distinct f_downloadIPaddress) AS "Total_Downloads",
       count(distinct case when d.product = 'A' then f_downloadIPaddress end) as ProductA,
       count(distinct case when d.product = 'B' then f_downloadIPaddress end) as ProductB
FROM (SELECT d.*, 
             DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
             DATEPART(MONTH,f_downloadtimestamp) as var_Month,
             DATEPART(DAY,f_downloadtimestamp) as var_Day,
      FROM tb_downloads d
     ) d
 GROUP BY var_Year, var_Month, var_Day
 ORDER BY var_Year desc, var_Month desc, var_Day DESC

注:2つの列の合計は、合計よりも大きくなる場合があります。これは、同じIPアドレスに両方の製品がある場合に発生します。

于 2013-02-25T18:26:41.557 に答える