2014-09-22 40 views
0

我一直在砸我的頭,試圖拿出正確的邏輯(SQL Server 2012)來實現某些我認爲會相當常規的事情,但我一直無法找到任何示例這在任何地方。基本上,我在表中有3列:產品,標誌,價值。產品可以在表格中多次列出,但只有一次使用唯一標誌(即,product1可以具有不同/相同的flag1或flag2,但不會有2個記錄與product1和flag1以及不同/相同的值) 。Sql服務器 - 基於條件運行總計

該標誌代表一個預先定義的值(1,2,3,4),該字段背後的意圖是能夠根據該標誌的值分配唯一的數學方程式。最終結果將產生一個單一的產品,獨特的標誌,以及基於數學方程式輸出的新累計總量。舉例來說,假設產品1列出了4次FLAG1,FLAG2,相當於Flag3,Flag4的的標誌值(見下文):

Product-----Flag-----Value 
Product1----Flag1----1.00 
Product1----Flag2----3.00 
Product1----Flag3----5.00 
Product1----Flag4----7.00 

Product-----Flag-----Value 
Product1----Flag1----1.00 (flag1 value) 
Product1----Flag2----4.00 (flag1+flag2 value) 
Product1----Flag3----6.00 (flag1+flag3 value) 
Product1----Flag4----10.00 (flag2+flag4 value) 

標誌1被定義爲只添加FLAG1。 Flag2被定義爲添加標誌1和標誌2。標誌3被定義爲添加標誌1和標誌3.標誌4被定義爲添加標誌2和標誌4。新輸出將被product1列出四次,其標誌值爲flag1,flag2,flag3,flag4,但新值爲flag1,flag1_flag2,flag1 + flag3,flag2 + flag4。

我試圖通過case語句應用邏輯,但我無法弄清楚如何遍歷每個條件的所有產品,並且我試圖使用運行總計解決方案,但我不知道如何合併標誌條件進入它,所以只有當這些條件爲真時,它才執行總計運行。任何援助和/或文章,以幫助讓我沿着正確的道路將不勝感激。

+0

是基於固定所有的時間標誌的「獨特的數學公式」,或者是有一些變化?不同的產品會有不同的計算標誌嗎? – 2014-09-22 13:20:55

+2

但產品1未列出4次 – Paparazzi 2014-09-22 13:24:39

+0

所有產品的標誌方程式都是固定的,因此所有產品將共享相同的數學方程式。更正了產品名稱。謝謝! – TStewartFan 2014-09-22 13:51:58

回答

1

儘管我不確定自己完全理解了你的問題,但我認爲這可能就是你想要的。爲了這個工作,它假定當標誌1到3是flag1並且當flag4是flag2時flag1總是存在。

;with cte as (
    select 
     product, 
     max(case when flag = 'Flag1' then Value end) as f1Value, 
     max(case when flag = 'Flag2' then Value end) as f2Value, 
     max(case when flag = 'Flag3' then Value end) as f3Value, 
     max(case when flag = 'Flag4' then Value end) as f4Value 
    from flags group by Product 
) 

select 
    flags.Product, 
    flags.Flag, 
    flags.Value as "Org. value", 
    case flag 
     when 'Flag1' then f1Value 
     when 'Flag2' then f1Value + f2Value 
     when 'Flag3' then f1Value + f3Value 
     when 'Flag4' then f2Value + f4Value 
     else flags.Value -- take the present value when flag is not Flag1-4 
    end as "New value"  
from flags 
inner join cte on flags.Product = cte.Product 

看看這個Sample SQL Fiddle看到它在行動。

+0

對不起,延遲寫回,但我剛從學校回家。顯然,由於重疊的日期範圍,我可能會重複使用相同標誌的產品,所以max()當前排除這些值。基本上我有兩個額外的列開始日期,停止日期。在某些日子裏,我可能有重疊的產品,並且不能保證每個類型至少有一個標誌。 – TStewartFan 2014-09-22 20:10:15

+0

@TStewartFan好吧,那麼你想如何處理重複的行?如果你想總結它們(根據與之前相同的公式)並且不關心日期,也許這就是你需要的? http://www.sqlfiddle.com/#!3/967cc/2 – jpw 2014-09-22 20:18:15

+0

我有一天的時間來致力於這個等式,我所走過的每條道路都讓我離真正的答案更遠。日期很重要,因爲它們代表了成本的開始時間。例如,在您的示例中,01/01上的product2/flag1應該與其關聯的累積成本爲1.00。然而,01/02上的product2/flag1應該有12.00的累積成本與其相關聯。 – TStewartFan 2014-09-23 15:09:30

0

我假設並嘗試了Range值。

CREATE TABLE #tmp (Product VARCHAR(10), flag VARCHAR(10),value numeric(13,2)) 
GO 
INSERT INTO #tmp 
    SELECT 'Product1' , 'Flag1',1 
    UNION 
SELECT 'Product1' , 'Flag2',3 
    UNION 
SELECT 'Product1' , 'Flag3',5 
    UNION 
SELECT 'Product1' , 'Flag4',7 
GO 
      ;WITH cte 
      AS 
    (
    SELECT row_number() OVER(
      ORDER BY flag) 'row',* 
     FROM #tmp 
    ) 
SELECT *,value 'RT' 
    FROM cte 
    WHERE row = 1 
    UNION 
SELECT * ,(
    SELECT cte.value 
     FROM cte 
     WHERE row = 1 
    )     + value 'RT' 
    FROM cte 
    WHERE row BETWEEN 2 
     AND 3 
    UNION 
SELECT * ,(
    SELECT cte.value 
     FROM cte 
     WHERE row =2 
    )     + value 'RT' 
    FROM cte 
    WHERE row >3 
GO 
DROP TABLE #tmp 
0

您可以加入一個表與自身,並適當地挑選條件:

SELECT p1.product,p1.Flag,p1.Value + COALESCE(p2.Value,0) 
FROM 
    Products p1 
     left join 
    Products p2 
     on 
      p1.Product = p2.Product and 
      p2.Flag = CASE p1.Flag 
         --1 doesn't need a previous value 
         WHEN 2 THEN 1 
         WHEN 3 THEN 1 
         WHEN 4 THEN 2 
        END