2011-08-04 2 views
4

Busting my stackoverflow.com cherry!SQL Server 조건부 그룹 작성자

10 개의 nchar (1) 열을 보유하는 SQL Server 2008 테이블이 있습니다. 테이블을 쿼리하여 10 개의 열을 조합하여 개수를 그룹화 한 저장된 proc을 작성하려고했습니다.

| COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10 
+======+======+======+======+======+======+======+======+======+====== 
| T | P | 9 | C | ) | N | N | S | X | X 
| T | P | 9 | 7 | 0 | * | N | Q | X | X 
| T | P | I | B | ( | H | N | S | X | X 
| T | P | A | A | G | S | N | 6 | X | X 

내가 열 1, 3 그룹에 수 있어야하고 싶어 : 예를 들어, 나는 테이블에 이러한 행이 말

COUNT | COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10 
+=====+======+======+======+======+======+======+======+======+============= 
| 2 | T | - | 9 | - | - | - | - | - | - | - 
| 1 | T | - | A | - | - | - | - | - | - | - 
| 1 | T | - | I | - | - | - | - | - | - | - 

을 아니면 내가에 그룹으로 할 수 있도록하려면 열 1, 2, 8, 얻을이 :

COUNT | COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10 
+=====+======+======+======+======+======+======+======+======+============= 
| 2 | T | P | - | - | - | - | - | S | - | - 
| 1 | T | P | - | - | - | - | - | 6 | - | - 
| 1 | T | P | - | - | - | - | - | Q | - | - 

나는 동적으로 클라이언트 측에서 쿼리를 만들 수 있고 함께 할 생각합니다. 나는 그것이 지금 가장 간단한 해결책 일 것이라고 생각한다. 그러나 나중에 동적 SQL을 사용하지 않고 서버 측에서 을 수행하는 간단한 방법이 있습니까? 글쎄, 난 항상 동적 인 SQL은 보통 나쁜 아이디어라고 읽었습니다. 이 경우에 선호되는 방법일까요?

(너무 나쁜 나 불꽃 내가 다음에하지 않은 경우 stackoverflow.com 에티켓. 단지 그것을 지적하고 더 나은 다음을 수행하려고 드리겠습니다하지 않으려 고.)

답변

5
CREATE PROCEDURE GetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
AS 
SELECT 
    COUNT = COUNT(*), 
    CASE @col1 WHEN 1 THEN COL1 END COL1, 
    CASE @col2 WHEN 1 THEN COL2 END COL2, 
    CASE @col3 WHEN 1 THEN COL3 END COL3, 
    CASE @col4 WHEN 1 THEN COL4 END COL4, 
    CASE @col5 WHEN 1 THEN COL5 END COL5, 
    CASE @col6 WHEN 1 THEN COL6 END COL6, 
    CASE @col7 WHEN 1 THEN COL7 END COL7, 
    CASE @col8 WHEN 1 THEN COL8 END COL8, 
    CASE @col9 WHEN 1 THEN COL9 END COL9, 
    CASE @col10 WHEN 1 THEN COL10 END COL10 
FROM YourTable 
GROUP BY 
    CASE @col1 WHEN 1 THEN COL1 END, 
    CASE @col2 WHEN 1 THEN COL2 END, 
    CASE @col3 WHEN 1 THEN COL3 END, 
    CASE @col4 WHEN 1 THEN COL4 END, 
    CASE @col5 WHEN 1 THEN COL5 END, 
    CASE @col6 WHEN 1 THEN COL6 END, 
    CASE @col7 WHEN 1 THEN COL7 END, 
    CASE @col8 WHEN 1 THEN COL8 END, 
    CASE @col9 WHEN 1 THEN COL9 END, 
    CASE @col10 WHEN 1 THEN COL10 END 

UPDATE 결과 쿼리가 동적으로 생성되지 않기 때문에, 당신은 테이블 반환 함수로 구현할 수 그런데

:

CREATE FUNCTION fnGetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
RETURNS TABLE 
AS 
RETURN (
    SELECT 
    … 
) 
01 23,516,

와 SP에서 대신 전화 :

것은이
CREATE PROCEDURE GetGroups (
    @Col1 bit, 
    @Col2 bit, 
    @Col3 bit, 
    @Col4 bit, 
    @Col5 bit, 
    @Col6 bit, 
    @Col7 bit, 
    @Col8 bit, 
    @Col9 bit, 
    @Col10 bit 
) 
AS 
SELECT * 
FROM fnGetGroups(@Col1, @Col2, @Col3, @Col4, @Col5, 
       @Col6, @Col7, @Col8, @Col9, @Col10) 

하는 TVF는 SP는 응용 프로그램에서 직접 호출하는 것이 바람직 할 수 있지만, 다양한 SQL 스크립트에서 사용하기보다 간편한 될 수 있습니다.

+0

와우. 굉장해. 고맙습니다. – Frank