2017-03-30 12 views
1

UNION ALLを使用して無関係なデータからリストを作成すると、SQL Server 2008でExcelに保存されます。SELECTステートメントのいずれかにORDER BYと私の問題は、次のエラーメッセージサブクエリなしのUNION ALLで1つのクエリのみを処理する方法

'The multi-part identifier "p.Category" could not be bound.' 

で発生するところである。これは、最初のSELECTクエリのコメントを外すとき、私は二、以下の1が、休憩を好むことを単純化した作業コードの例です:

CREATE TABLE #People(Category varchar(50), [Name] varchar(50)); 

INSERT INTO #People VALUES(1, 'Steve'); 
INSERT INTO #People VALUES(99, 'Anna'); 
INSERT INTO #People VALUES(2, 'Sarah'); 

-- Unrelated data SELECT query 
--SELECT 'Best Employee' AS Matrix 
--  , 'Alan' AS [Name] 
--UNION ALL 

SELECT CASE 
      WHEN p.Category = 1 
      THEN 'Very Active' 
      WHEN p.Category = 2 
      THEN 'Active ' 
      ELSE 'Departed' 
     END AS Matrix 
    , p.name AS [Name] 
FROM #People p 
ORDER BY p.Category; 

DROP TABLE #People; 

いくつかの調査の後、次のような方法でクエリを書き直すことができたことがわかりました。この小さな例では望みの結果が得られましたが、実際のケースでは理想的と思われるものはありません。下の作業例のように、サブクエリに頼らずに正しい結果を得る方法はありますか?

CREATE TABLE #People(Category varchar(50), [Name] varchar(50)); 

INSERT INTO #People VALUES(1, 'Steve'); 
INSERT INTO #People VALUES(99, 'Anna'); 
INSERT INTO #People VALUES(2, 'Sarah'); 

SELECT * 
FROM 
(
    -- Unrelated data SELECT query 
    SELECT 'Best Employee' AS Matrix 
     , 'Alan' AS [Name] 
     , '' AS Category 

    UNION ALL 

    SELECT CASE 
       WHEN p.Category = 1 
       THEN 'Very Active' 
       WHEN p.Category = 2 
       THEN 'Active ' 
       ELSE 'Departed' 
      END Matrix 
     , p.name AS [Name] 
     , p.Category Category 
    FROM #People p 
) x 
ORDER BY x.Category; 

DROP TABLE #People; 

答えて

1

ORDER BYがちょうど1 SELECTには適用されません、それはすべての行がUNION編された後、全体の結果に、結果セット全体に適用されます。したがって、並べ替えに使用する列をSELECTUNION ALLに含める必要があります。

UNIONの最後のSELECTの後に、ORDER BYがある必要があるため、たとえば、次の構文が間違っています。

SELECT CASE 
      WHEN p.Category = 1 
      THEN 'Very Active' 
      WHEN p.Category = 2 
      THEN 'Active ' 
      ELSE 'Departed' 
     END AS Matrix 
    , p.name AS [Name] 
FROM #People p 
ORDER BY p.Category 

UNION ALL 

SELECT 'Best Employee' AS Matrix 
    , 'Alan' AS [Name] 

質問からあなたの第二の例では、サブクエリなしで、より簡単な形で書くことができる。いずれの場合において

SELECT CASE 
      WHEN p.Category = 1 
      THEN 'Very Active' 
      WHEN p.Category = 2 
      THEN 'Active ' 
      ELSE 'Departed' 
     END AS Matrix 
    , p.name AS [Name] 
    , p.Category 
FROM #People p 

UNION ALL 

SELECT 'Best Employee' AS Matrix 
    , 'Alan' AS [Name] 
    , NULL AS Category --- or '' AS Category 

ORDER BY Category; 

、カラムCategoryは各SELECTステートメントに追加されなければなりませんUNION。私はあなたがそれを避ける方法を見ていない。

0

注文が原因で2つのテーブルが混在している場合は、最初の選択結果セットが常に最初に表示されるように列を追加できます。

CREATE TABLE #People(Category varchar(50), [Name] varchar(50)); 

INSERT INTO #People VALUES(1, 'Steve'); 
INSERT INTO #People VALUES(99, 'Anna'); 
INSERT INTO #People VALUES(2, 'Sarah'); 

SELECT Matrix, Name, Category 
FROM 
(
    -- Unrelated data SELECT query 
    SELECT 'Best Employee' AS Matrix 
     , 'Alan' AS [Name] 
     , '' AS Category 
     , 1 as Ord 

UNION ALL 

    SELECT CASE 
       WHEN p.Category = 1 
       THEN 'Very Active' 
       WHEN p.Category = 2 
       THEN 'Active ' 
       ELSE 'Departed' 
      END Matrix 
     , p.name AS [Name] 
     , p.Category Category, 
     2 as Ord 
    FROM #People p 
) x 
ORDER BY x.Ord --,Additional Order by columns 
+0

「SELECT」ステートメントの実際の数が本当に心配しているわけではありません。私の望みは、「ORDER BY」を使ってステートメントを変更し、他のステートメントをそのまま残すことでした。 – sams

関連する問題