2012-05-21 3 views
1

나는 스타 스키마에 repect 다음과 같은 데이터베이스 디자인을 가지고 :이 쿼리에 부서 이름을 표시하는 방법은 무엇입니까?

나는 그것의 해답의 모든 경우에도와의 subquesiont을 포함하여 각 질문에 참가자의 총 수를 표시하는 쿼리를 마련 할 필요가
alll table: ID, user_id, cat_id, qa_id 
user table: user_id, name, department 
category table: cat_id, cat_text, sub_cat_text 
QA table: aq_id, q_id, answer_id 
question table: q_id, q_text, sub_q_text 
answer table: answer_id, text 

이 답 중 하나에 참가자가 없습니다. 다행히 질문, 하위 질문, 각 답변의 총 참가자 수를 보여주는 쿼리를 만들 수있었습니다. 그러나 이제 문제는 부서를 보여주는 것입니다. 응답 중 하나에 참여자가 없으면 부서는 NULL로 표시됩니다. 어떻게 수정해야합니까?

내 쿼리 :

여기
SELECT  dbo.question.q_text, dbo.question.sub_q_text, COUNT(dbo.[user].user_id) AS Expr1, dbo.answer.text, dbo.[user].department 
FROM   dbo.alll INNER JOIN 
         dbo.category ON dbo.alll.cat_id = dbo.category.cat_id INNER JOIN 
         dbo.QA ON dbo.alll.qa_id = dbo.QA.aq_id INNER JOIN 
         dbo.[user] ON dbo.alll.user_id = dbo.[user].user_id INNER JOIN 
         dbo.question ON dbo.QA.q_id = dbo.question.q_id RIGHT OUTER JOIN 
         dbo.answer ON dbo.QA.answer_id = dbo.answer.answer_id 
WHERE  (dbo.[user].department = 'pmod') AND (dbo.question.q_text = 'q1') OR 
         (dbo.[user].department IS NULL) 
GROUP BY dbo.answer.text, dbo.question.q_text, dbo.question.sub_q_text, dbo.[user].department 

데이터베이스의 스크립트는 :

USE [master] 
GO 
/****** Object: Database [survey2] Script Date: 05/22/2012 13:18:16 ******/ 
CREATE DATABASE [survey2] ON PRIMARY 
(NAME = N'survey2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\survey2.mdf' , SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'survey2_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\survey2_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
GO 
ALTER DATABASE [survey2] SET COMPATIBILITY_LEVEL = 100 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [survey2].[dbo].[sp_fulltext_database] @action = 'enable' 
end 
GO 
ALTER DATABASE [survey2] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [survey2] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [survey2] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [survey2] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [survey2] SET ARITHABORT OFF 
GO 
ALTER DATABASE [survey2] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [survey2] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [survey2] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [survey2] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [survey2] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [survey2] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [survey2] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [survey2] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [survey2] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [survey2] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [survey2] SET DISABLE_BROKER 
GO 
ALTER DATABASE [survey2] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [survey2] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [survey2] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [survey2] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [survey2] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [survey2] SET READ_COMMITTED_SNAPSHOT OFF 
GO 
ALTER DATABASE [survey2] SET HONOR_BROKER_PRIORITY OFF 
GO 
ALTER DATABASE [survey2] SET READ_WRITE 
GO 
ALTER DATABASE [survey2] SET RECOVERY SIMPLE 
GO 
ALTER DATABASE [survey2] SET MULTI_USER 
GO 
ALTER DATABASE [survey2] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [survey2] SET DB_CHAINING OFF 
GO 
USE [survey2] 
GO 
/****** Object: Table [dbo].[category] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[category](
    [cat_id] [int] IDENTITY(1,1) NOT NULL, 
    [cat_text] [varchar](50) NOT NULL, 
    [sub_cat_text] [varchar](50) NULL, 
CONSTRAINT [PK_category] PRIMARY KEY CLUSTERED 
(
    [cat_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[answer] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[answer](
    [answer_id] [int] IDENTITY(1,1) NOT NULL, 
    [text] [varchar](50) NOT NULL, 
CONSTRAINT [PK_answer] PRIMARY KEY CLUSTERED 
(
    [answer_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[user] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[user](
    [user_id] [int] IDENTITY(1,1) NOT NULL, 
    [name] [varchar](50) NOT NULL, 
    [department] [varchar](50) NOT NULL, 
CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED 
(
    [user_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[question] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[question](
    [q_id] [int] IDENTITY(1,1) NOT NULL, 
    [q_text] [varchar](50) NOT NULL, 
    [sub_q_text] [varchar](50) NULL, 
CONSTRAINT [PK_question] PRIMARY KEY CLUSTERED 
(
    [q_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[QA] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[QA](
    [aq_id] [int] IDENTITY(1,1) NOT NULL, 
    [q_id] [int] NOT NULL, 
    [answer_id] [int] NOT NULL, 
CONSTRAINT [PK_QA] PRIMARY KEY CLUSTERED 
(
    [aq_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[alll] Script Date: 05/22/2012 13:18:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[alll](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [user_id] [int] NULL, 
    [cat_id] [int] NULL, 
    [qa_id] [int] NULL, 
CONSTRAINT [PK_alll] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: View [dbo].[showing number of participants in each Q] Script Date: 05/22/2012 13:18:18 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE VIEW [dbo].[showing number of participants in each Q] 
AS 
SELECT  COUNT(dbo.question.q_id) AS Expr1, dbo.[user].department, dbo.category.cat_text, dbo.category.sub_cat_text, dbo.question.q_text 
FROM   dbo.alll INNER JOIN 
         dbo.answer ON dbo.alll.answer_id = dbo.answer.answer_id INNER JOIN 
         dbo.category ON dbo.alll.cat_id = dbo.category.cat_id INNER JOIN 
         dbo.question ON dbo.alll.q_id = dbo.question.q_id INNER JOIN 
         dbo.[user] ON dbo.alll.user_id = dbo.[user].user_id 
GROUP BY dbo.[user].department, dbo.category.cat_text, dbo.category.sub_cat_text, dbo.question.q_text 
GO 
EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00] 
Begin DesignProperties = 
    Begin PaneConfigurations = 
     Begin PaneConfiguration = 0 
     NumPanes = 4 
     Configuration = "(H (1[40] 4[20] 2[20] 3))" 
     End 
     Begin PaneConfiguration = 1 
     NumPanes = 3 
     Configuration = "(H (1 [50] 4 [25] 3))" 
     End 
     Begin PaneConfiguration = 2 
     NumPanes = 3 
     Configuration = "(H (1 [50] 2 [25] 3))" 
     End 
     Begin PaneConfiguration = 3 
     NumPanes = 3 
     Configuration = "(H (4 [30] 2 [40] 3))" 
     End 
     Begin PaneConfiguration = 4 
     NumPanes = 2 
     Configuration = "(H (1 [56] 3))" 
     End 
     Begin PaneConfiguration = 5 
     NumPanes = 2 
     Configuration = "(H (2 [66] 3))" 
     End 
     Begin PaneConfiguration = 6 
     NumPanes = 2 
     Configuration = "(H (4 [50] 3))" 
     End 
     Begin PaneConfiguration = 7 
     NumPanes = 1 
     Configuration = "(V (3))" 
     End 
     Begin PaneConfiguration = 8 
     NumPanes = 3 
     Configuration = "(H (1[56] 4[18] 2))" 
     End 
     Begin PaneConfiguration = 9 
     NumPanes = 2 
     Configuration = "(H (1 [75] 4))" 
     End 
     Begin PaneConfiguration = 10 
     NumPanes = 2 
     Configuration = "(H (1[66] 2))" 
     End 
     Begin PaneConfiguration = 11 
     NumPanes = 2 
     Configuration = "(H (4 [60] 2))" 
     End 
     Begin PaneConfiguration = 12 
     NumPanes = 1 
     Configuration = "(H (1))" 
     End 
     Begin PaneConfiguration = 13 
     NumPanes = 1 
     Configuration = "(V (4))" 
     End 
     Begin PaneConfiguration = 14 
     NumPanes = 1 
     Configuration = "(V (2))" 
     End 
     ActivePaneConfig = 0 
    End 
    Begin DiagramPane = 
     Begin Origin = 
     Top = 0 
     Left = 0 
     End 
     Begin Tables = 
     Begin Table = "alll" 
      Begin Extent = 
       Top = 61 
       Left = 226 
       Bottom = 178 
       Right = 386 
      End 
      DisplayFlags = 280 
      TopColumn = 0 
     End 
     Begin Table = "answer" 
      Begin Extent = 
       Top = 182 
       Left = 0 
       Bottom = 269 
       Right = 160 
      End 
      DisplayFlags = 280 
      TopColumn = 0 
     End 
     Begin Table = "category" 
      Begin Extent = 
       Top = 36 
       Left = 426 
       Bottom = 138 
       Right = 586 
      End 
      DisplayFlags = 280 
      TopColumn = 0 
     End 
     Begin Table = "question" 
      Begin Extent = 
       Top = 189 
       Left = 427 
       Bottom = 291 
       Right = 587 
      End 
      DisplayFlags = 280 
      TopColumn = 0 
     End 
     Begin Table = "user" 
      Begin Extent = 
       Top = 45 
       Left = 0 
       Bottom = 147 
       Right = 160 
      End 
      DisplayFlags = 280 
      TopColumn = 0 
     End 
     End 
    End 
    Begin SQLPane = 
    End 
    Begin DataPane = 
     Begin ParameterDefaults = "" 
     End 
     Begin ColumnWidths = 9 
     Width = 284 
     Width = 2265 
     Width = 1500 
     Width = 1500 
     Width = 1500 
     Width = 1500 
     Width = 1500 
     Width = 1500 
     Width = 1500 
     End 
    End 
    Begin CriteriaPane = 
     Begin ColumnWidths = 12 
     Column = 1440 
     Alias = 900 
     Table' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'showing number of participants in each Q' 
GO 
EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane2', @value=N' = 1170 
     Output = 720 
     Append = 1400 
     NewValue = 1170 
     SortType = 1350 
     SortOrder = 1410 
     GroupBy = 1350 
     Filter = 1350 
     Or = 1350 
     Or = 1350 
     Or = 1350 
     End 
    End 
End 
' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'showing number of participants in each Q' 
GO 
EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPaneCount', @value=2 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'showing number of participants in each Q' 
GO 
/****** Object: ForeignKey [FK_QA_answer] Script Date: 05/22/2012 13:18:17 ******/ 
ALTER TABLE [dbo].[QA] WITH CHECK ADD CONSTRAINT [FK_QA_answer] FOREIGN KEY([answer_id]) 
REFERENCES [dbo].[answer] ([answer_id]) 
GO 
ALTER TABLE [dbo].[QA] CHECK CONSTRAINT [FK_QA_answer] 
GO 
/****** Object: ForeignKey [FK_QA_question] Script Date: 05/22/2012 13:18:17 ******/ 
ALTER TABLE [dbo].[QA] WITH CHECK ADD CONSTRAINT [FK_QA_question] FOREIGN KEY([q_id]) 
REFERENCES [dbo].[question] ([q_id]) 
GO 
ALTER TABLE [dbo].[QA] CHECK CONSTRAINT [FK_QA_question] 
GO 
/****** Object: ForeignKey [FK_alll_category] Script Date: 05/22/2012 13:18:17 ******/ 
ALTER TABLE [dbo].[alll] WITH CHECK ADD CONSTRAINT [FK_alll_category] FOREIGN KEY([cat_id]) 
REFERENCES [dbo].[category] ([cat_id]) 
GO 
ALTER TABLE [dbo].[alll] CHECK CONSTRAINT [FK_alll_category] 
GO 
/****** Object: ForeignKey [FK_alll_QA] Script Date: 05/22/2012 13:18:17 ******/ 
ALTER TABLE [dbo].[alll] WITH CHECK ADD CONSTRAINT [FK_alll_QA] FOREIGN KEY([qa_id]) 
REFERENCES [dbo].[QA] ([aq_id]) 
GO 
ALTER TABLE [dbo].[alll] CHECK CONSTRAINT [FK_alll_QA] 
GO 
/****** Object: ForeignKey [FK_alll_user] Script Date: 05/22/2012 13:18:17 ******/ 
ALTER TABLE [dbo].[alll] WITH CHECK ADD CONSTRAINT [FK_alll_user] FOREIGN KEY([user_id]) 
REFERENCES [dbo].[user] ([user_id]) 
GO 
ALTER TABLE [dbo].[alll] CHECK CONSTRAINT [FK_alll_user] 
GO 
+0

귀하의 스키마가 약간 이상하게 보입니다. QA와 모두를 분리해야하는 이유는 무엇입니까? 카테고리가 왜 모든 것이 아니라는 것입니까? 왜 사용자는 대답이 아닌 모든 것에 대한 자산입니까? 어떤 사용자가 어떤 질문을했는지를 어떻게 기록합니까? 그것이 의미하는 바대로 질문마다 하나도 저장하지 않기 때문에 각 질문마다 0이 아닌 부서를 표시 할 방법이 없습니다. 질문에 대한 사용자의 부서를 원한다고 생각합니까? 먼저 – Rup

+0

, 사용자는 질문을하지 않거나 입력하지 않습니다. 둘째, 각 테이블이 중앙 테이블로 간주되는 ALL 테이블을 제외한 데이터로 채워진 별표 체계를 사용하고 있습니다. 이 질문이 귀하의 우려에 응답하길 바랍니다. – Kemoid

+0

괜찮 았나? - 설문 조사는 고정 된 질문과 답변으로 구성되어 있습니다. 나는 StackOverflow Q & A와 같은 것을 상상할 수있다. 여기서 사용자와 대답을 분리하는 것은 비정규 화를 떠날 것이다. 나는 주어진 응답에 사용자 참여자가 없을 때 어떤 부서를 기대하는지 아직도 확실하지 않다. 대신에 모든 부서를 0으로 표시하려고합니까? – Rup

답변

2

이것은 내가 당신이 찾고있는 생각 쿼리 이다. 먼저 사용자와 질문을 교차 결합합니다. 이제는 둘 사이에 가능한 모든 조합이 있으므로 일치하는 대답을 계산할 수 있습니다.

편집 : 조인을 크로스 조인으로 변경하면 0을 셀 수 있습니다.

SELECT 
     dbo.[user].department, 
     dbo.question.q_text, 
     dbo.question.sub_q_text, 
     dbo.answer.text, 
     COUNT(qa.answer_id) AS Users_Answered 
    FROM [user] 
CROSS JOIN question 
CROSS JOIN answer 
    LEFT JOIN alll 
    ON [user].User_ID = alll.User_ID 
    LEFT JOIN qa 
    ON alll.qa_id = qa.aq_id 
    AND question.q_id = qa.q_id 
    AND qa.answer_id = answer.answer_id 
GROUP BY  
     dbo.[user].department, 
     dbo.question.q_text, 
     dbo.question.sub_q_text, 
     dbo.answer.text 
ORDER BY 1, 2 

You might check it @ Sql Fiddle.

New version of query @ Sql Fiddle.

+0

감사합니다 니콜라, 하지만 내 요구에 도달하지 못했습니다 ... 예를 들어 내가 원하는 것은 질문 1과 모든 하위 질문 및 각 질문/하위 질문을 다음과 같이 검색하는 것입니다. number of 답변의 사용자는 강력하게 답변 사용자의 번호가 강하게 나는 이제 희망 해답의 사용자 수를 특정 부서 을 모르는 동의 답변 사용자의 수 ... 을 동의 답변 사용자의 수를 동의 동의 취소 ... – Kemoid

+0

@Kemoid 추측을 피하기 위해 일부 샘플 데이터와 예상 결과를 게시 할 수 있습니까? –

+0

내 DB의 스크립트를 첨부하여 보았습니다. 이고 원하는 출력 결과는 question_text, Sub-question_text, answer, number_of_participants, department 과 같은 열이 포함 된 표입니다. q1, sub_q1, 강하게 동의, 3, 부서 1 예 : q1, sub_q1, 강력하게 의견이 맞지 않음, 1, 부서 1 예 : q1, sub_q1, agree, 3, department1 예 : q1, sub_q1, 동의하지 않음, 0, 부서 1 예 : q1, sub_q2, 강하게 동의, 3, 부서 1 예 : q1, sub_q2, 강력하게 동의하지 않음, 1, 부서 1 예. q1, sub_q2, 동의 함, 0, 부서 1 예 : q1, sub_q2, 동의하지 않음, 4, 부서 1 등등 ... – Kemoid

관련 문제