2014-11-22 43 views
4

我有一個4列在我的表...如何在sql中匹配值?

digit1 digit2 digit3 amount 
    1  2  3  1 
    2  2  2  1 
    2  1  3  1 
    3  2  1  1 

,我想他們組如果行有相同的數字value..and輸出會是這樣:

digit1 digit2 digit3 amount 
    1  2  3  3 
    2  2  2  1 

這個noob問題遺憾though..i'm堅持了自去年night..tnx這個事情提前

+0

組在同一哪個數字?你有digit1,2,3嗎? – Monah 2014-11-22 06:44:19

+0

你正在使用哪些DBMS? MS SQL Server/MySQL/Oracle? – 2014-11-22 06:52:04

+0

如果一行中包含相同的數字.. like(1,2,3)&(3,2,1)&(2,1,3)可以爲它們組獲得相同的數字集合。 – 2014-11-22 06:54:40

回答

2

這裏的解決方案

如果所有數字具有相同的一組數字(2,1,3),(3,2,1),...等,這意味着它們具有相同的階乘

例如:2 * 1 * 3 = 3 * 2 * 1 ...等

:這個解決方案適用於大於零(階乘規則)不同的任何數字

步驟的溶液

  1. 化妝乘法和加法的每一行
  2. 化妝分區基礎上,乘法和加法,並將其命名[部分]
  3. 採取僅出現在記錄一次=> [部分] = 1
  4. 算上記錄

這裏的解決方案

with fact 
as(
select Id,digit1,digit2,digit3,digit1*digit2*digit3 as [mult],digit1+digit2+digit3 as [sum] 
from Data),part as(
    select Id,digit1,digit2,digit3,[mult],[sum],row_number() over(partition by [mult],[sum] order by [mult],[sum]) as [Part] 
    from fact 
) 
select Id,digit1,digit2,digit3,(select count(*) 
           from fact f where f.[mult]=p.[mult] and f.[sum]=p.[sum]) as amount 
from part p 
where part=1 

這裏一個正確的結果DEMO

希望它會幫助你

+0

哦..耶!因次的事情..我的大腦早前沒有告訴我..該死的你的大腦..! tnx先生..很多tnx! – 2014-11-22 07:42:28

+0

聰明的想法+1從我 – mah 2014-11-22 07:43:58

+0

@yoyieyoyie你沒有標記爲答案,我的解決方案中是否有任何弱點? – Monah 2014-11-22 07:50:08

1
please try this one i did it in oracle but its simple sql so it will too work on your DBMS 

select digit1,digit2,digit3,(select sum(amount) from expdha 
          where digit2<>digit1+1 and digit3<>digit2+1) amount 
from expdha 
     where digit2=digit1+1 and digit3=digit2+1 
     group by digit1,digit2,digit3 
    union 
     select digit1,digit2,digit3,amount from expdha 
     where digit1=digit2 and digit2=digit3; 

其中expdha是你的表,如果需要解釋的話,我可以解釋它。

+0

是的!先生..我真的需要解釋什麼是真正在那裏.. – 2014-11-22 07:31:49

1

使用Case Statement獲取列,然後使用Group by子句得到結果。嘗試這個。

SELECT col1,col2,col3,Sum(amount) As Sum_Amount 
FROM (SELECT CASE WHEN digit1 > digit2 AND digit1 > digit3 THEN digit1 
        WHEN digit2 > digit1 AND digit2 > digit3 THEN digit2 
        ELSE digit3 
       END col1, 
       CASE WHEN (digit1 > digit2 OR digit1 > digit3) AND (digit1 < digit3 OR digit1 < digit2) THEN digit1 
        WHEN (digit2 > digit1 OR digit2 > digit3) AND (digit2 < digit3 OR digit2 < digit1) THEN digit2 
       ELSE digit3 
       END col2, 
       CASE 
       WHEN digit1 < digit2 AND digit1 < digit3 THEN digit1 
       WHEN digit2 < digit1 AND digit2 < digit3 THEN digit2 
       ELSE digit3 
       END col3, 
       * 
     FROM #test) a 
GROUP BY col1,col2,col3