2013-10-04 28 views
2

我的公司有程序,員工,客戶和活動。我們希望爲每個程序中的每個員工審計兩個隨機客戶端事件。如何思考集合

我創建了一個查詢來選擇在程序中過去六個月中有客戶事件的所有員工。

SELECT TOP(2) 
    program_id, staff_id, client_id, event_date 
FROM 
    events 
INNER JOIN 
    client ON events.client_id = client.client_id 
WHERE 
    <blah, blah> --by date range, program, client showed up at event ... 
ORDER BY 
    NEWID() --randomizes the top 2 picked from this set 

現在,我需要遍歷每個程序中的每個工作人員。員工可以在多個計劃中服務,在這種情況下,我們會審覈每個員工/計劃組合的兩個客戶事件。

結果應該是這樣的:

program_id staff_id client_id event_date 

p1 12345 abc123 8/26/2013 
      xyz123 5/16/2013 
p1 23456 bcd123 7/26/2013 
      wxy123 4/16/2013 
p2 12345 cde123 9/26/2013 
      xyz123 3/16/2013 
p3 34567 efg123 7/26/2013 
      uvw123 5/16/2013 

(將是冷靜,對每個節目單獨的標​​籤中吐出了這一點到XLS)

其他人已經張貼了類似的問題。我發佈這個,因爲它是一個如何思考的純粹例子。請幫我重複一遍。謝謝。

+0

使用SSMS是無關緊要的。 – Kermit

+0

@PowderSnorkel - 如果其中一個答案提供瞭解決方案,則將其標記爲已回答。謝謝:) – BClaydon

回答

0

我有幾點建議,但不是完全的答案。我要做的一件事是在SQL中通過program_id進行分組,這樣你就可以看到每個程序都有它的員工。

這解決了你的最後一個問題 - 平行行可以通過自聯接完成。

SELECT lt1.program_id 
    , lt1.staff_id  
    , lt1.client_id 
    , lt1.event_date 
    , lt2.staff_id  
    , lt2.client_id 
    , lt2.event_date 

FROM youLastTable lt1 
    Join youLastTable on lt1.program_id = lt2.program_id 

會產生這樣的:

p1 12345 abc123 8/26/2013 xyz123 5/16/2013 
p1 23456 bcd123 7/26/2013 wxy123 4/16/2013 
p2 12345 cde123 9/26/2013 xyz123 3/16/2013 
p3 34567 efg123 7/26/2013 uvw123 5/16/2013 

關於第一個問題,如何通過隨機組獲得兩行,嘗試分組值,只剩下我知道,如果它的工作原理。例如:

SELECT TOP(2) 
    program_id, staff_id, client_id, event_date 
FROM 
    events 
INNER JOIN 
    client ON events.client_id = client.client_id 
WHERE 
    <blah, blah> --by date range, program, client showed up at event ... 
GROUP BY program_id -- and possibly, staff_id 
ORDER BY 
    NEWID() --randomizes the top 2 picked from this set 
+0

好的開始。現在主要的挑戰是:1.迭代,以便我們爲每個員工提供兩個客戶端事件。 2.將結果吐出到每個程序的單獨xls選項卡中。謝謝! – PowderSnorkel

+0

太酷了!得到這個工作,幾乎是我需要的結果。但是,至少你讓我思考。謝謝!現在我將嘗試下面的PARTITION BY示例。 – PowderSnorkel

+0

我發現很多人從循環切換到設置都很棘手。我經常使用臨時表或簡單集合並逐步進行,以便我可以看到每個步驟的結果。這就是爲什麼您的第一個查詢中的GROUP BY program_id將幫助您可視化並描述第二步需要的內容。這就是說,我對隨機化模糊,但我非常確定分組將有所幫助,並@usr可能有答案。 – BClaydon

0

我不是100%肯定我已經理解了要求,但你一定能夠適應這個您的需求。我將它們理解爲「針對每個員工/計劃組合,隨機抽取兩個事件」。

我首先計算可能的人員/程序組合。然後,每個組合我們要畫兩個隨機事件:

WITH combinations AS (
SELECT DISTINCT program_id, staff_id 
FROM events 
) 
SELECT e.* 
FROM combinations c 
CROSS APPLY (
SELECT TOP 2 * 
FROM events e 
WHERE e.program_id = c.program_id AND e.staff_id = c.staff_id 
ORDER BY NEWID() 
) e 

CROSS APPLY的意思是「每個外排(從c在這種情況下繪製)加入以下行吧」。

這裏有一個不同的版本:

SELECT * 
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY program_id, staff_id ORDER BY NEWID()) r 
FROM events e 
) e 
WHERE e.r <= 2 

更優雅。

+0

現在測試,謝謝! – PowderSnorkel

+0

是的!通過ORDER BY program_id,program_staff完成了PARTITION BY,然後添加了ORDER BY – PowderSnorkel