2017-10-28 7 views
0

説明:私は彼らのUpstreamID sおよびDownstreamID秒でConnectionsをモデル化したReadingsのネットワーク内のルート・ノードで構成されていReadingsテーブルのSomeIDある列を参照しようとしています。最も外側のSELECT内のサブクエリの列を参照するにはどうすればよいですか?

結果のクエリは私に根Readingsのセットのすべての上流Readingsを与えるとに分類さSomeDate月と年DailyReadings 'で/グループ化を集約されます。私は

これまで持って何

私は、次のクエリがあります

-- Query values of readings upstream of AnotherIDs that match their SpecialNumber for a whole month, summing values 
SELECT 
    md.SomeID AS 'Upstream SomeID', 
    m.AnotherID, 
    -- I'd like to refer to the root SomeID here 
    CAST(DATEPART(YEAR, SomeDate) AS VARCHAR) + ', ' + CAST(DATEPART(MONTH, SomeDate) AS VARCHAR) AS 'Month', 
    SUM(md.SomeValue) AS 'Sum of SomeValue' 
FROM 
    DailyReadings rd 
INNER JOIN 
    Readings r ON r.SomeID = rd.SomeID 
WHERE 
    rd.SomeID IN 
    (
     SELECT UpstreamID 
     FROM Connections 
     WHERE DownstreamID IN 
     ( 
      -- I want this column in my outer select. 
      -- I want a column for this ID (SomeID) 
      SELECT SomeID 
      FROM Readings 
      WHERE SpecialNumber = AnotherID 
      AND SpecialNumber IN 
      (
       '227796B', '225044', '578283', '578133', '578132', 
       '577925', '577878', '224998', '228282', '577394', 
       '227844', '225094', '578131', '218374', '577732', 
       '227845', '224978', '227773', '578280', '578078', 
       '577930', '228220', '578121', '227389', '218206', 
       '578179', '228034', '227864', '22593', '578040', 
       '578131' 
      ) 
      OR SpecialNumber LIKE '%228166%' 
      OR SpecialNumber LIKE '%577968%' 
      OR SpecialNumber LIKE '%228220%' 
      OR SpecialNumber LIKE '%577394%' 
      OR SpecialNumber LIKE '%578132%' 
     ) 
    ) 
GROUP BY 
    rd.SomeID, AnotherID, DATEPART(YEAR, SomeDate), DATEPART(MONTH, SomeDate) 
ORDER BY 
    'Month' DESC, AnotherID DESC 

を質問

私はトラバースを開始したルートReadingsのセットからSomeIDを表示することができます結果の表にある各行のアップストリームReadingsを探しますか?

+0

あなたはまだ読書に参加していません。だから、それは日々の読書と同じだ。誰か? – kbball

+0

@kbball - 残念ながら、それは私に上流の 'SomeID'を与えるでしょうが、私はすでにselect文でそれを持っています。さらに、最も内側のクエリの下流の読書に関連する 'SomeID'に興味があります。 –

+0

これは両方ともSomeIDと呼ばれていても、別のIDであることを明確にしています。 – kbball

答えて

0

私はあなたが外出先でサブテーブルを作成し、それらに参加することをお勧めします、同様にCteを使用して行うことができますが、これを最初に試してください。選択リストに目的の列を追加し、それに応じてグループを変更することができます。

SELECT 
    md.SomeID AS 'Upstream SomeID' 
    ,m.AnotherID 
    -- I'd like to refer to the root SomeID here 
    ,CAST(DATEPART(YEAR, SomeDate) AS VARCHAR) + ', ' + CAST(DATEPART(MONTH, SomeDate) AS VARCHAR) as 'Month' 
    ,SUM(md.SomeValue) AS 'Sum of SomeValue' 
FROM DailyReadings rd 
INNER JOIN Readings r ON r.SomeID = rd.SomeID 
INNER JOIN (SELECT UpstreamID 
    FROM Connections) A 
On rd.someid = a.upstreamid 
INNER JOIN (SELECT SomeID 
     FROM Readings 
     WHERE SpecialNumber = AnotherID 
     AND SpecialNumber IN 
     ( 
      '227796B' 
      ,'225044' 
      ,'578283' 
      ,'578133' 
      ,'578132' 
      ,'577925' 
      ,'577878' 
      ,'224998' 
      ,'228282' 
      ,'577394' 
      ,'227844' 
      ,'225094' 
      ,'578131' 
      ,'218374' 
      ,'577732' 
      ,'227845' 
      ,'224978' 
      ,'227773' 
      ,'578280' 
      ,'578078' 
      ,'577930' 
      ,'228220' 
      ,'578121' 
      ,'227389' 
      ,'218206' 
      ,'578179' 
      ,'228034' 
      ,'227864' 
      ,'22593' 
      ,'578040' 
      ,'578131' 
     ) 
     OR SpecialNumber LIKE '%228166%' 
     OR SpecialNumber LIKE '%577968%' 
     OR SpecialNumber LIKE '%228220%' 
     OR SpecialNumber LIKE '%577394%' 
     OR SpecialNumber LIKE '%578132%') B 
On A.DownstreamId = B.SomeId 
+0

これは、私のためには機能しません。なぜなら、 'A'の' DownstreamID'は、クエリが最下位に達するまでには未知であるからです。 –

+0

@ JakeSmith Aにその列を追加しようとしましたか、Aの代わりにテーブル名全体を入れようとしましたか。 –

+0

あなたの提案から何も変えていません。最後の行 –

0

実際のスキーマに従って翻訳する必要がありますが、これらのテーブルを結合するだけの理由はありません。読み込みテーブルが2回結合されていることに注意してください。

SELECT 
    md.SomeID AS 'Upstream SomeID' 
    ,r2.SomeID 
    -- I'd like to refer to the root SomeID here 
    ,CAST(DATEPART(YEAR, SomeDate) AS VARCHAR) + ', ' + CAST(DATEPART(MONTH, SomeDate) AS VARCHAR) as 'Month' 
    ,SUM(rd.SomeValue) AS 'Sum of SomeValue' 
FROM DailyReadings rd 
INNER JOIN Readings r ON r.SomeID = rd.SomeID 
INNER JOIN Connections c ON rd.SomeID = c.UpstreamID 
INNER JOIN Readings r2 ON c.DownstreamID = r2.SomeID 
WHERE r2.SpecialNumber = AnotherID 
AND r2.SpecialNumber IN 
     ( 
      '227796B' 
      ,'225044' 
      ,'578283' 
      ,'578133' 
      ,'578132' 
      ,'577925' 
      ,'577878' 
      ,'224998' 
      ,'228282' 
      ,'577394' 
      ,'227844' 
      ,'225094' 
      ,'578131' 
      ,'218374' 
      ,'577732' 
      ,'227845' 
      ,'224978' 
      ,'227773' 
      ,'578280' 
      ,'578078' 
      ,'577930' 
      ,'228220' 
      ,'578121' 
      ,'227389' 
      ,'218206' 
      ,'578179' 
      ,'228034' 
      ,'227864' 
      ,'22593' 
      ,'578040' 
      ,'578131' 
     ) 
     OR SpecialNumber LIKE '%228166%' 
     OR SpecialNumber LIKE '%577968%' 
     OR SpecialNumber LIKE '%228220%' 
     OR SpecialNumber LIKE '%577394%' 
     OR SpecialNumber LIKE '%578132%' 
    ) 
) 
GROUP BY rd.SomeID, r2.SomeID, DATEPART(YEAR, SomeDate), 
DATEPART(MONTH, SomeDate) 
ORDER BY 'Month' DESC, AnotherID DESC 
+0

私はこのアプローチをとると、私の質問からの質問で2000件以上のレコード(6,000件ではなく8,000件)を取得しています。これは全く同じではないと感じさせる。 –

+0

あなたのデータを見ることなくなぜその理由を言うのは難しいです。テーブルとサンプルデータの簡単な例を見ると役に立ちます – kbball

関連する問題