簡體   English   中英

為多個列選擇不同的值

[英]Selecting distinct values for multiple columns

我有一張表,其中許多數據與另一棵樹中的另一列相匹配,類似於一棵樹,然后在每個特定葉的“葉”處有數據

例如

Food Group      Name       Caloric Value  
Vegetables      Broccoli   100  
Vegetables      Carrots    80    
Fruits          Apples     120  
Fruits          Bananas    120  
Fruits          Oranges    90

我想設計一個查詢,該查詢將僅返回每列的不同值,然后為null以覆蓋溢出

例如

Food group    Name     Caloric Value  
Vegetables    Broccoli 100  
Fruit         Carrots  80  
              Apples   120  
              Bananas  90  
              Oranges   

我不確定是否可行,現在我一直在嘗試處理案件,但是我希望會有更簡單的方法

似乎您只是在嘗試掌握所有不同的值。 為什么? 出於顯示目的? 這是應用程序的工作,而不是服務器的工作。 您可以簡單地進行三個查詢,如下所示:

SELECT DISTINCT [Food Group] FROM atable;

SELECT DISTINCT Name FROM atable;

SELECT DISTINCT [Caloric Value] FROM atable;

並相應地顯示其結果。

但是,如果您堅持將它們全部放在一個表中,則可以嘗試以下操作:

WITH atable ([Food Group], Name, [Caloric Value]) AS (
  SELECT 'Vegetables', 'Broccoli', 100  UNION ALL
  SELECT 'Vegetables', 'Carrots',  80   UNION ALL
  SELECT 'Fruits',     'Apples',   120  UNION ALL
  SELECT 'Fruits',     'Bananas',  120  UNION ALL
  SELECT 'Fruits',     'Oranges',  90   
),
atable_numbered AS (
  SELECT
    [Food Group], Name, [Caloric Value],
    fg_rank = DENSE_RANK() OVER (ORDER BY [Food Group]),
    n_rank  = DENSE_RANK() OVER (ORDER BY Name),
    cv_rank = DENSE_RANK() OVER (ORDER BY [Caloric Value])
  FROM atable
)
SELECT
  fg.[Food Group],
  n.Name,
  cv.[Caloric Value]
FROM (
  SELECT fg_rank FROM atable_numbered  UNION
  SELECT n_rank  FROM atable_numbered  UNION
  SELECT cv_rank FROM atable_numbered
) r (rank)
  LEFT JOIN (
    SELECT DISTINCT [Food Group], fg_rank
    FROM atable_numbered) fg ON r.rank = fg.fg_rank
  LEFT JOIN (
    SELECT DISTINCT Name, n_rank
    FROM atable_numbered) n  ON r.rank = n.n_rank
  LEFT JOIN (
    SELECT DISTINCT [Caloric Value], cv_rank
    FROM atable_numbered) cv ON r.rank = cv.cv_rank
ORDER BY r.rank

我想我想知道的是為什么您需要一個結果集呢? 代碼看起來像什么將消耗此結果? 每行上的屬性彼此無關。 例如,如果要構建一組下拉框的內容,則最好一次執行一次。 在您請求的結果集中,您需要遍歷數據集三次以執行任何有用的操作,並且您需要每次都檢查NULL或不必要地迭代直到數據集的末尾。

如果這是在存儲過程中,則無法運行三個單獨的SELECT DISTINCT並將值作為三個結果返回。 然后,您一次可以食用一次,我想您無論如何都會這樣做。

如果值之間確實存在聯系,則可以將每個結果添加到數組或列表中,然后使用索引並行訪問所有三個列表。

像這樣的東西?

select *
from (
  select case 
          when row_number() over (partition by fruit_group) = 1 then fruit_group
          else null 
        end as fruit_group,
        case 
          when row_number() over (partition by name) = 1 then name
          else null
        end as name,
        case 
          when row_number() over (partition by caloric) = 1 then caloric
          else null
        end as caloric
  from your_table
) t
where fruit_group is not null
   or name is not null
   or caloric is not null

但我看不出這有什么意義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM