2

Microsoft SQL Server2008R2に対して次のクエリを作成しました...

with 
downloads as
(
    select convert(varchar(10), timestamp, 112) as downloadDate, COUNT(*) as counter 
    from <download_table> 
    group by convert(varchar(10), timestamp,112)
),
uploads as 
(
    select CONVERT(varchar(10), dateadded, 112) as uploadDate, COUNT(*) as counter
    from <upload_table>
    group by CONVERT(varchar(10), dateadded, 112)
)
select 
    downloads.downloadDate, 
    uploads.uploadDate, 
    downloads.counter as dCount,
    uploads.counter as uCount
from downloads 
full join uploads on uploads.uploadDate = downloads.downloadDate
order by downloadDate desc;

次のテーブルを返します。

downloadDate    uploadDate  dCount  uCount
20121211    NULL        40  NULL
20121210    NULL        238 NULL
20121207    20121207    526 4
20121206    20121206    217 12
20121205    NULL        108 NULL
20121204    20121204    190 13
20121203    NULL        141 NULL
20121130    20121130    248 187
20121129    NULL        134 NULL
20121128    NULL        102 NULL
20121127    20121127    494 57
20121126    NULL        153 NULL
20121119    20121119    319 20
20121118    NULL        4   NULL
20121116    20121116    215 16
20121112    20121112    431 144
20121109    20121109    168 48
20121108    20121108    132 181
NULL        20121125    NULL    3

しかし、いくつかのNULLエントリを取得せずに、2つの日付を1つの「日付」列に結合することはできません。また、dCountまたはuCountのNULL値を取得して、NULLではなく0を表示することもできません。

誰かがこれを手伝ってくれませんか?

4

4 に答える 4

2

SQL方言によってはIFNULL()、、、などのようなものがNVL()、「18000101」などの過去の日付を優先してNULLを取り除くのに役立ちます。COALESCE()IIF()

それが終わったら、、、、、または友達を使用して、単一の「最終使用MAX()日」列を作成できます。SWITCH()IIF()IF()

于 2012-12-11T11:34:37.307 に答える
2

SQL Serve、rではCOALESCE、最初のnull以外の値を返す日付フィールドとカウント合計の周りを使用して、値をゼロISNULLに置き換えることができます。null

with 
downloads as
(
    select convert(varchar(10), timestamp, 112) as downloadDate, COUNT(*) as counter 
    from download_table 
    group by convert(varchar(10), timestamp,112)
),
uploads as 
(
    select CONVERT(varchar(10), dateadded, 112) as uploadDate, COUNT(*) as counter
    from upload_table
    group by CONVERT(varchar(10), dateadded, 112)
)
select 
    coalesce(downloads.downloadDate, uploads.uploadDate) as dDate, 
    isnull(downloads.counter, 0) as dCount,
    isnull(uploads.counter, 0) as uCount
from downloads 
full join uploads 
  on uploads.uploadDate = downloads.downloadDate
order by downloadDate desc;

SQL FiddlewithDemoを参照してください

結果:

|    DDATE | DCOUNT | UCOUNT |
------------------------------
| 20121211 |      2 |      0 |
| 20121210 |      1 |      1 |
| 20121207 |      1 |      0 |
| 20121206 |      2 |      1 |
| 20121208 |      0 |      1 |
| 20121209 |      0 |      1 |
| 20121204 |      0 |      1 |
| 20121205 |      0 |      1 |
于 2012-12-11T11:38:16.123 に答える
1

次のようにcoalesceとnvlを使用できます。

with 
downloads as
(
    select convert(varchar(10), timestamp, 112) as downloadDate, COUNT(*) as counter 
    from <download_table> 
    group by convert(varchar(10), timestamp,112)
),
uploads as 
(
    select CONVERT(varchar(10), dateadded, 112) as uploadDate, COUNT(*) as counter
    from <upload_table>
    group by CONVERT(varchar(10), dateadded, 112)
)
select 
    coalesce(downloads.downloadDate, uploads.uploadDate) as dDate, 
    nvl(downloads.counter, 0) as dCount,
    nvl(uploads.counter, 0) as uCount
from downloads 
full join uploads on uploads.uploadDate = downloads.downloadDate
order by downloadDate desc;
于 2012-12-11T11:35:09.947 に答える
1

まず、varcharに変換するのではなく、time要素を削除する場合は、datetimeをdateにキャストする方がはるかに優れています。SQL-Server2008では、次のように簡単に使用できます。

CAST(DateAdded AS DATE)

次に、FULL JOINを使用するのではなく、を使用してこれをUNION ALL実行します。パフォーマンスが向上するはずです(ただし、実際のデータをテストせずに100%とは言えません)。

WITH Data AS
(   SELECT  [Date] = CAST(Timestamp AS DATE),
            [Downloads] = 1,
            [Uploads] = 0
    FROM    Download_Table
    UNION ALL
    SELECT  [Date] = CAST(DateAdded AS DATE),
            [Downloads] = 0,
            [Uploads] = 1
    FROM    Upload_Table
)
SELECT  [Date], 
        [Downloads] = SUM(Downloads),
        [Uploads] = SUM(Uploads)
FROM    Data
GROUP BY [Date]
ORDER BY [Date];
于 2012-12-11T11:41:33.500 に答える