2017-09-26 4 views
1

무기 종류별로 수확 한 날짜가있는 데이터 집합이 있습니다. 데이터는 아래의 예제를 설정 :같은 날에 두 개의 특정 값이 발생하는 경우 합계

입니다 내가 수행하는 것이 무엇
Species Total HarvestMonthDayYear WeaponID WeaponType 
Deer  623 1/14/2017   1   Gun 
Deer  10  1/14/2017   3   Reg Bow 
Deer  15  1/14/2017   4   Crossbow 
Deer  5  9/20/2017   4   Crossbow 
Deer  9  9/21/2017   2   Muzzleloader 
Deer  2  9/21/2017   3   Reg Bow 
Deer  1  9/21/2017   4   Crossbow 
Deer  1  9/21/2017   8   Shotgun 
Deer  10  9/22/2017   1   Gun 
Deer  1  9/22/2017   3   Reg Bow 

"등록 활 '과 같은 날에"석궁 "수확, 나는"양궁 "라는 하나의 행에 결과를 결합하고자하는 때. 일반 활과 석궁이 수확 사슴에 사용되었다 그래서 하나 개의 세트로 사람들을 결합하고 싶습니다 - 2017년 1월 14일 및 2017년 9월 22일에

Species Total HarvestMonthDayYear WeaponID WeaponType 
Deer 623 1/14/2017   1   Gun 
Deer 25  1/14/2017   10  Archery 
Deer 5  9/20/2017   4   Crossbow 
Deer 9  9/21/2017   2   Muzzleloader 
Deer 3  9/21/2017   10  Archery 
Deer 1  9/21/2017   8   Shotgun 
Deer 10  9/22/2017   1   Gun 
Deer 1  9/22/2017   2   Muzzleloader 
Deer 1  9/22/2017   3   Reg Bow 

이 : -처럼 그리고 최종 데이터 세트가 보일 것입니다 그러나 09/20/2017 및 09/22/2017에 - 석궁 또는 일반 활 만 사용되었으므로이 결과는 그대로 남겨 두어야합니다.

이것이 가능합니까? 나는 이것을 코드화하기 시작하는 방법을 생각할 수 없다.

답변

0

이 당신이 필요로하는 무엇을 제공해야 , CTE는 사용하지만 U는 사용하지 않습니다. NION (테스트를 거쳤으며) 약간 더 성능이 우수합니다 ...

WITH HarvestResults AS 
(
SELECT Species, 
     Total, 
     HarvestMonthDayYear, 
     CASE WHEN WeaponType IN ('Crossbow','Reg Bow') THEN 10 ELSE WeaponID END AS WeaponID, 
     WeaponType, 
     LAG(HarvestMonthDayYear,1) OVER(ORDER BY Species,HarvestMonthDayYear) AS PrevHarvestDate, 
     LEAD(HarvestMonthDayYear,1) OVER(ORDER BY Species,HarvestMonthDayYear) AS NextHarvestDate, 
     LAG(WeaponType,1) OVER(ORDER BY Species,HarvestMonthDayYear) AS PrevWeaponType, 
     LEAD(WeaponType,1) OVER(ORDER BY Species,HarvestMonthDayYear) AS NextWeponType 
FROM dbo.Harvest 
) 
SELECT Species, 
     SUM(Total) AS TOTAL, 
     HarvestMonthDayYear, 
     CASE WHEN WeaponType IN ('Crossbow','Reg Bow') 
      AND ((PrevHarvestDate = HarvestMonthDayYear OR NextHarvestDate = HarvestMonthDayYear) 
      AND (PrevWeaponType IN ('Crossbow','Reg Bow') OR NextWeponType IN ('Crossbow','Reg Bow'))) 
      THEN 10 ELSE WeaponID END AS WeaponID, 
     CASE WHEN WeaponType IN ('Crossbow','Reg Bow') 
      AND ((PrevHarvestDate = HarvestMonthDayYear OR NextHarvestDate = HarvestMonthDayYear) 
      AND (PrevWeaponType IN ('Crossbow','Reg Bow') OR NextWeponType IN ('Crossbow','Reg Bow'))) 
      THEN 'Archery' ELSE WeaponType END AS WeaponType 
FROM HarvestResults 
GROUP BY Species, 
     HarvestMonthDayYear, 
     CASE WHEN WeaponType IN ('Crossbow','Reg Bow') 
       AND ((PrevHarvestDate = HarvestMonthDayYear OR NextHarvestDate = HarvestMonthDayYear) 
       AND (PrevWeaponType IN ('Crossbow','Reg Bow') OR NextWeponType IN ('Crossbow','Reg Bow'))) 
       THEN 10 ELSE WeaponID END, 
     CASE WHEN WeaponType IN ('Crossbow','Reg Bow') 
       AND ((PrevHarvestDate = HarvestMonthDayYear OR NextHarvestDate = HarvestMonthDayYear) 
       AND (PrevWeaponType IN ('Crossbow','Reg Bow') OR NextWeponType IN ('Crossbow','Reg Bow'))) 
       THEN 'Archery' ELSE WeaponType END 
ORDER BY Species, 
     HarvestMonthDayYear, 
     WeaponID, 
     WeaponType; 
1

당신 수 구절이 노동 조합과 같은 :

WITH cte AS (
    SELECT Species, HarvestMonthDayYear, SUM(Total) AS Total 
    FROM yourTable 
    WHERE 
     WeaponType IN ('Reg Bow', 'Crossbow') 
    GROUP BY 
     Species, HarvestMonthDayYear 
    HAVING COUNT(DISTINCT WeaponType) = 2 
) 
SELECT 
    t1.Species, t1.Total, t1.HarvestMonthDayYear, t1.WeaponID, t1.WeaponType 
FROM yourTable t1 
LEFT JOIN cte t2 
    ON t1.Species = t2.Species AND 
     t1.HarvestMonthDayYear = t2.HarvestMonthDayYear 
WHERE 
    t2.Species IS NULL OR 
    (t2.Species IS NOT NULL AND WeaponType NOT IN ('Reg Bow', 'Crossbow')) 
UNION ALL 
SELECT 
    Species, Total, HarvestMonthDayYear, 10, 'Archery' 
FROM cte; 

데모 여기 :

Rextester

1

TCE없이 :

SELECT Species, HarvestMonthDayYear, SUM(Total) AS Total 
    , CASE WHEN WeaponType IN ('Reg Bow', 'Crossbow') THEN 10 ELSE WeaponID END AS WeaponID 
    , MAX(CASE WHEN WeaponType IN ('Reg Bow', 'Crossbow') THEN 'Archery' ELSE WeaponType END) AS WeaponType 
FROM yourTable 
GROUP BY 
    Species, HarvestMonthDayYear 
    , (CASE WHEN WeaponType IN ('Reg Bow', 'Crossbow') THEN 10 ELSE WeaponID END)