2017-09-26 9 views
1

種別の武器の種類別の日付による集計があるデータセットがあります。データは、以下の例を設定します。2つの特定の値が同じ日に発生した場合の合計値

である私は達成するためにどうなるか
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 

「レッグボウ」と同じ日に「クロスボウ」の収穫が、私は「アーチェリー」という名前の1行に結果を結合したいときに。そして、最終的なデータセットは、次のようになります。

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 

- 私は1つのセットにそれらを結合したいと思いますので、定期的な弓とクロスボウは収穫鹿に使用されました - しかし、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; 

デモ:TCEなし

Rextester

1

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) 
関連する問題