1

2 つの別々のサーバーに 2 つのビューがあります。

これらのビューは、名前、月、カウントを出力します

ある人 (Joe User) の 1 つのビューは 7 月、8 月だけかもしれないので、次のように表示されます。

Joe User July 19
Joe User August 28

次のビューでは、さらに多くのビューが表示される可能性があります

Joe User May 20
Joe User June 98
Joe User July 18
Joy User August 24

出力を表示しようとしているのはこれです。

Joe User January 0 0
Joe User February 0 0
Joe User March 0 0
Joe User April 0 0
Joe User May 20 0
Joe User June 98 0 
Joe User July 18 19
Joe User August 24 28
Joe User September 0 0
Joe User October 0 0
Joe User November 0 0
Joe User December 0 0

私の質問は、値がない場合でも月をどのように入力できますか? 次に、私が持っている値に参加します。

アップデート:

以下の例では、非常によく似た結果が得られます。WHEREに名前を追加せずに実行しようとすると、次のようになります。

Joe User April 65 518
Joe User April 87 518
Joe User April 52 518
Joe User April 3  518

これは、1 か月あたり 64 行のテーブル値で繰り返されます。

4

3 に答える 3

3

日付テーブルを使用してから、2 つのテーブルを使用する必要がありJOINます。それ以外の場合は、次のようにクエリ内に作成できます。

SELECT m.month, CASE WHEN c.ccount IS NULL THEN 0 ELSE c.ccount END AS view2,
CASE WHEN b.ccount IS NULL THEN 0 ELSE b.ccount END AS view1
FROM
(SELECT 'January' AS month
  UNION ALL
  SELECT 'February'
  UNION ALL
  SELECT 'March'
  UNION ALL
  SELECT 'April'
  UNION ALL
  SELECT 'May'
  UNION ALL
  SELECT 'June'
  UNION ALL
  SELECT 'July'
  UNION ALL
  SELECT 'August'
  UNION ALL
  SELECT 'September'
  UNION ALL
  SELECT 'November'
  UNION ALL
  SELECT 'December') m
LEFT JOIN (SELECT name, month, ccount FROM view1 WHERE name = 'Joe') b ON b.month = m.month
LEFT JOIN (SELECT name, month, ccount FROM view2 WHERE name = 'Joe') c ON c.month = m.month

結果

| | 月 | 月 | ビュー2 | ビュー1 |
------------------------------
| | 1月 | 0 | 0 |
| | 2月 | 0 | 0 |
| | 3 月 | 0 | 0 |
| | 4月 | 0 | 0 |
| | 5 月 | 20 | 0 |
| | 6月 | 98 | 0 |
| | 7月 | 18 | 19 |
| | 8月 | 24 | 28 |
| | 9月 | 0 | 0 |
| | 11月 | 0 | 0 |
| | 12月 | 0 | 0 |
于 2013-01-28T18:47:24.803 に答える
1
SELECT DATENAME(mm, DATEADD(mm, number, '20010101')), 
       ISNULL(v2.[count], 0), ISNULL(v1.[count], 0)
FROM master..spt_values v LEFT JOIN view1 v1 ON DATENAME(mm, DATEADD(mm, v.number, '20010101')) = v1.[month] AND v1.name = 'Joe User'
                          LEFT JOIN view2 v2 ON DATENAME(mm, DATEADD(mm, v.number, '20010101')) = v2.[month] AND v2.name = 'Joe User'
WHERE v.type = 'P' AND v.number < 12

SQLFiddle のデモ

アップデート

SELECT *
FROM
(
 SELECT v1.name
 FROM view1 v1
 UNION
 SELECT v2.name
 FROM view2 v2
 ) u CROSS APPLY (
                  SELECT DATENAME(mm, DATEADD(mm, number, '20010101')) AS [month], 
                         ISNULL(v2.[count], 0) AS [count1], ISNULL(v1.[count], 0) AS [count2]                       
                  FROM master..spt_values v 
                    LEFT JOIN view1 v1 ON DATENAME(mm, DATEADD(mm, v.number, '20010101')) = v1.[month] AND v1.name = u.name
                    LEFT JOIN view2 v2 ON DATENAME(mm, DATEADD(mm, v.number, '20010101')) = v2.[month] AND v2.name = u.name
                  WHERE v.type = 'P' AND v.number < 12
                  ) o

SQLFiddleの新しいデモ

于 2013-01-28T20:58:45.237 に答える
1

まず、リンク サーバーを作成するか、 を使用する必要がありますOPENROWSET。でこれを試してくださいOPENROWSET

;WITH Months
AS
(
    SELECT 1 m, DATENAME(mm, '20000101') MN
    UNION ALL
    SELECT m+1, DATENAME(mm, DATEADD(m, m, '20000101')) MN
    FROM Months
    WHERE m < 12
)
SELECT
   COALESCE(V1.nmae, V2.name) Name, 
   M.MN [Month], 
   ISNULL(V1.count, 0) Count1, 
   ISNULL(V2.count, 0) Count12 
FROM Months M
    LEFT JOIN ViewOnCurrentServer V1
        ON M.MN = V1.[month]
    LEFT JOIN
         OPENROWSET('SQLNCLI', 'Server=YouServerName;Trusted_Connection=yes;',
                    'SELECT name, month, count
                     FROM DBName.SchemeName.ViewOnAnotherServer') V2
       ON M.MN = V2.[month]
WHERE COALESCE(V1.nmae, V2.name) = 'Joe User'

または、リンク サーバーを使用する場合は、次を使用します。

;WITH Months
AS
(
    SELECT 1 m, DATENAME(mm, '20000101') MN
    UNION ALL
    SELECT m+1, DATENAME(mm, DATEADD(m, m, '20000101')) MN
    FROM Months
    WHERE m < 12
)
SELECT
   COALESCE(V1.nmae, V2.name) Name, 
   M.MN [Month], 
   ISNULL(V1.count, 0) Count1, 
   ISNULL(V2.count, 0) Count12 
FROM Months M
    LEFT JOIN ViewOnCurrentServer V1
        ON M.MN = V1.[month]
    LEFT JOIN
         ViewOnLinkedServer V2
       ON M.MN = V2.[month]
WHERE COALESCE(V1.nmae, V2.name) = 'Joe User'
于 2013-01-28T19:19:42.703 に答える