복붙노트

[SQL] SQL 서버 2008 크로스 탭 쿼리

SQL

SQL 서버 2008 크로스 탭 쿼리

나는 보통 내 응용 프로그램에 필요한 모든 SQL 쿼리를 알아낼 수 있지만, 나는 최근에 내가 만들 필요하고 도움이 될 수 있다면 궁금 크로스 탭 쿼리에 의해 난처한 상황에 빠진 한?

내가 3 개 테이블이

Category(catID, catTitle) 
Equipment(equipID, make, model, quantity, catID, siteID)
Site(siteID, title)

그리고 다음과 같은 결과 집합을 표시하는 크로스 탭 쿼리를 만들 싶습니다

Category   Site1   Site2   Site3   Site4   Site5
PC           2       0       10      3      6
Camera       12      4       2       0      8
Printer      3       2       1       1      2

숫자는 장비 테이블 withint 수량 필드를 사용하여 각 사이트 내 각 카테고리 항목의 총을 나타내는 표시됩니다. 나는 전에 크로스 탭 쿼리를해야했던 적이없는 나는이 작업을 얻기 위해 고군분투하고있다.

해결법

  1. ==============================

    1.당신은 '피봇'연산자를 사용하여이 작업을 수행 할 수 있어야합니다. 이런 식으로 뭔가 (내가 확신하지만 나는 ... 맞춤법이나 문법 사항을 muffed) :

    당신은 '피봇'연산자를 사용하여이 작업을 수행 할 수 있어야합니다. 이런 식으로 뭔가 (내가 확신하지만 나는 ... 맞춤법이나 문법 사항을 muffed) :

    select catTitle, [1] as site1, [2] as site2, [3] as site3, [4] as site4, [5] as site5
      from (select category.catTitle, equipment.quantity, site.title
              from equipment
                inner join site
                  on (equipment.siteid = site.siteid)
                inner join category
                  on (category.catid = equipment.catid)
            ) 
      pivot
      (
      sum (quantity)
        for equipment.siteid in ( [1], [2], [3], [4], [5] )
      ) as pvt
    order by pvt.category;
    

    이 문제는 당신이 쿼리에 포함 할 사이트 ID의 정확한 세트를 알 필요가 있다는 것입니다. 당신이 (당신이 Excel에서 얻을 수있는 것처럼)보다 동적 인 크로스 탭을 필요로하는 경우에, 당신은 그것을 실행하는 문자열을 사용 sp_executesql을 같이 쿼리 텍스트를 생성해야합니다. 생성 된 텍스트에서는 "[1], [2], [3], [4], [5] ..."및 "[1]과 같은 사이트 1 [2]와 같은 많은 사이트 2로 포함한다 .. . "일이 필요로.

  2. ==============================

    2.나는 당신이 당신의 위치 및 장비 사이에 참조 할 수있는 테이블 누락 생각

    나는 당신이 당신의 위치 및 장비 사이에 참조 할 수있는 테이블 누락 생각

    뭐 그런 :

    EquipmentSite(SiteID, EquipID)
    

    지금은 얘기하는 것은 불가능하기 때문에 어떤 사이트하는 장비로

    편집하다 :

    siteID 장비도 있기 때문에 내가 다른 테이블을 제안 할 것이다, 당신의 데이터베이스 약간의 리팩토링 (난 정말이 작업을 수행하는 방법을 모르기 때문에)

    당신은 많은 데이터를 얻을 경우 데이터를 가져오고 모든 것은 당신이 그 데이터에 액세스 할 때마다 계산 엉망이 될 것입니다.

    나는이 테이블을 제안한다 그래서

    siteCatCount(CatID, siteID, cnt)
    

    그래서 당신은 당신의 데이터 (추가하거나 제거 장비)을 수정할 때이 테이블을 업데이트 갈 것, 그것은 훨씬 더 명확하게 될 것이다 그리고 당신은 모든 장비마다의 수를 계산해야 실 거예요

  3. from https://stackoverflow.com/questions/7956908/sql-server-2008-cross-tab-query by cc-by-sa and MIT license