[英]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.