0

私は特定のSQL文字列を作成します。

私はこのテーブルを持っています:

cities
-----------
city varchar not null  primary key
etc


weeks
-----------
week varchar not null  primary key


Insert_data
-----------
id int not null  primary key
cityID varchar
week varchar
value1 int
etc

このテーブル構造でasp.netグリッドビューをバインドします:

+-----+-------+-------+-------+
| city| week1 | week2 | week3 |
+-----+-------+-------+-------+
|   1 | (y/n) | (y/n) | (y/n) |
|   2 | (y/n) | (y/n) | (y/n) |
|   3 | (y/n) | (y/n) | (y/n) |
|   4 | (y/n) | (y/n) | (y/n) |
|   5 | (y/n) | (y/n) | (y/n) |
+----+-------+-------+-------+

その週に関連するレコードが insert_data にある場合、値は Y になります。

これに対してクエリ文字列を作成することは可能ですか?

4

1 に答える 1

0
いつものように、「引数によるグループ化」(都市) を使用して行から列を作成する必要がある場合は、PIVOT 演算子を使用できます。http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

上記は MS-SQL にのみ適用され、MySQL には適用されません。

または、昔ながらの方法でそれを行うことができます

SELECT 
     cities.city
     ,SUM(CASE WHEN weeks.week = 1 THEN Insert_data.value1 ELSE 0 END) AS week1
     ,SUM(CASE WHEN weeks.week = 2 THEN Insert_data.value1 ELSE 0 END) AS week2
     ,SUM(CASE WHEN weeks.week = 3 THEN Insert_data.value1 ELSE 0 END) AS week3
     ,SUM(CASE WHEN weeks.week = 4 THEN Insert_data.value1 ELSE 0 END) AS week4
     -- ,etc. for each week (select distinct week from insert_data order by week)
FROM Insert_data
left join cities
    cities.city= Insert_data.cityID 
left join weeks
    on weeks.week = Insert_data.week

group by cities.city

いずれにしても、SQL 文字列で週を動的にハードコーディングする必要があります。

y と n に追加の条件が必要になり、値を連結できます。

      ,'(' + CAST(SUM(CASE WHEN weeks.week = 1 AND value1 = 1 THEN 1 ELSE 0 END) as varchar(10))
+ '/'
CAST(SUM(CASE WHEN weeks.week = 1 AND value1 = 0 THEN 1 ELSE 0 END) as varchar(10))
+ ')'
AS week1

または、単に y または no の場合、

      ,
      CASE 
          WHEN SUM(CASE WHEN weeks.week = 1 THEN Insert_data.value1 ELSE 0 END) > 0 
               THEN 'y'
          ELSE 'n'
    END AS week1 
于 2013-11-13T08:36:07.980 に答える