簡體   English   中英

我如何過濾掉最新運行的數據並將行數交叉表成列?

[英]HOW do i filter out the latests runs in and crosstab the rowns into columns?

| product | tests | runs | results |
|---------|-------|------|---------|
| A       | AD    | 1    | 12      |
| A       | AD    | 2    | 13      |
| A       | AD    | 3    | 14      |
| A       | SS    | 1    | 12      |
| A       | TD    | 1    | 12      |
| A       | TD    | 2    | 12      |
| B       | AD    | 1    | 11      |
| B       | SS    | 1    | 12      |
| c       | AD    | 1    | 12      |
| c       | AD    | 2    | 10      |
| D       | AD    | 1    | 16      |
| D       | SS    | 1    | 12      |

我用這個查詢:

select DISTINCT Poduct,
    SUM (case param_name when 'AD' then results ELSE 0 END) AS AD,
    SUM (case param_name when 'SS' then results ELSE 0 END) AS SS,
    SUM (case param_name when 'TD' then results ELSE 0 END) AS TD
FROM [product]
GROUP BY product
ORDER BY product

要以這種格式獲取它:

| PRODUCT | AD | SS | TD |
|---------|----|----|----|
| A       | 39 | 12 | 24 |
| B       | 11 | 12 | 0  |
| C       | 22 | 0  | 0  |
| D       | 16 | 12 | 0  |

我需要這種格式的文件,但問題是它會將所有在AD,SS和TD上運行的測試加起來。

我正在尋找的是:

| PRODUCT | AD | SS | TD |
|---------|----|----|----|
| A       | 14 | 12 | 12 |
| B       | 11 | 12 | 0  |
| C       | 10 | 0  | 0  |
| D       | 16 | 12 | 0  |

這只會從更大范圍的測試中提取結果。 有人可以幫忙嗎?

我想,假設你來回預期的結果,你是想SUM對這些列( AD,SS,TD )的基礎上你的最高RUN數量。 您可以根據需要使用ROW_NUMBER分配訂單,然后選擇正確的值集

嘗試這個...

WITH CTE AS 
( SELECT *, ROW_NUMBER() OVER(partition BY product,test order by runs desc) rownum FROM product
)
select Product,
    SUM (case test when 'AD' then results ELSE 0 END) AS AD,
    SUM (case test when 'SS' then results ELSE 0 END) AS SS,
    SUM (case test when 'TD' then results ELSE 0 END) AS TD
FROM CTE
WHERE rownum=1
GROUP BY product
ORDER BY product

解決此問題的一種方法是考慮一個具有以下字段的臨時表:product,tests和max_runs。 (即,確定每種產品+測試組合的最大運行次數)。 如果有這樣的表,則可以將其聯接回原始表(內部聯接)以僅選擇具有最大運行號的行。

然后,對結果使用case語句將起作用。

放在一起,您將得到:

select P.product, 
    sum(case P.tests when 'AD' then P.results ELSE 0 END) AS AD,
    sum(case P.tests when 'SS' then P.results ELSE 0 END) AS SS,
    sum(case P.tests when 'TD' then P.results ELSE 0 END) AS TD
from product P join 
(
SELECT product, tests, max(runs) As max_runs
from product
group by product, tests
  ) As M
on P.product=M.product and P.tests=M.tests and P.runs=M.max_runs
group by P.product
order by P.product

如果您想使用它,請查看此SQL Fiddle

嘗試這個:

select product, max(ad) ad, max(ss) ss, max(td) td
from (
  select Product,
      MAX(case tests when 'AD' then results ELSE 0 END) AS AD,
      MAX(case tests when 'SS' then results ELSE 0 END) AS SS,
      MAX(case tests when 'TD' then results ELSE 0 END) AS TD
  FROM product
  GROUP BY product, tests
) test_reports
group by product
ORDER BY product;

演示 @ SQL Fiddle

暫無
暫無

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

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